Java集合框架(例如基本的數據結構)里包含了最常見的Java常見面試問題。很好地理解集合框架,可以幫助你理解和利用Java的一些高級特性。下面是面試Java核心技術的一些很實用的問題。
Q:最常見的數據結構有哪些,在哪些場景下應用它們?
A. 大部分人都會遺漏樹和圖這兩種數據結構。樹和圖都是很有用的數據結構。如果你在回答中提及到它們的話,面試者可能會對你進行進一步進行的考核。
Q:你如何自己實現List,Set和Map?
A:雖然Java已經提供了這些接口的經過實踐證明和測試過的實現,但是面試者還是喜歡這樣問,來測試你對數據結構的理解。我寫的《Core Java Career Essentials》一書中通過圖例和代碼詳細地講解了這些內容。
常見的數據結構
數組是最常用的數據結構。數組的特點是長度固定,可以用下標索引,并且所有的元素的類型都是一致的。數組常用的場景有把:從數據庫里讀取雇員的信息存儲為EmployeeDetail[],把一個字符串轉換并存儲到一個字節數組中便于操作和處理,等等。盡量把數組封裝在一個類里,防止數據被錯誤的操作弄亂。另外,這一點也適合其他的數據結構。
列表和數組很相似,只不過它的大小可以改變。列表一般都是通過一個固定大小的數組來實現的,并且會在需要的時候自動調整大小。列表里可以包含重復的元素。常用的場景有,添加一行新的項到訂單列表里,把所有過期的商品移出商品列表,等等。一般會把列表初始化成一個合適的大小,以減少調整大小的次數。
集合和列表很相似,不過它不能放重復的元素。當你需要存儲不同的元素時,你可以使用集合。
堆棧只允許對最后插入的元素進行操作(也就是后進先出,Last In First Out – LIFO)。如果你移除了棧頂的元素,那么你可以操作倒數第二個元素,依次類推。這種后進先出的方式是通過僅有的peek(),push()和pop()這幾個方法的強制性限制達到的。這種結構在很多場景下都非常實用,例如解析像(4+2)*3這樣的數學表達式,把源碼中的方法和異常按照他們出現的順序放到堆棧中,檢查你的代碼看看小括號和花括號是不是匹配的,等等。
這種用堆棧來實現的后進先出(LIFO)的機制在很多地方都非常實用。例如,表達式求值和語法解析,校驗和解析XML,文本編輯器里的撤銷動作,瀏覽器里的瀏覽記錄,等等。這里是一些關于堆棧的一些Java面試題。
隊列和堆棧有些相似,不同之處在于在隊列里第一個插入的元素也是第一個被刪除的元素(即是先進先出)。這種先進先出的結構是通過只提供peek(),offer()和poll()這幾個方法來訪問數據進行限制來達到的。例如,排隊等待公交車,銀行或者超市里的等待列隊等等,都是可以用隊列來表示。
這里是一個用多線程來訪問阻塞隊列的例子。
鏈表是一種由多個節點組成的數據結構,并且每個節點包含有數據以及指向下一個節點的引用,在雙向鏈表里,還會有一個指向前一個節點的引用。例如,可以用單向鏈表和雙向鏈表來實現堆棧和隊列,因為鏈表的兩端都是可以進行插入和刪除的動作的。當然,也會有在鏈表的中間頻繁插入和刪除節點的場景。Apache的類庫里提供了一個TreeList的實現,它是鏈表的一個很好的替代,因為它只多占用了一點內存,但是性能比鏈表好很多。也就是說,從這點來看鏈表其實不是一個很好的選擇。
ArrayList是列表的一個很好的實現。相比較TreeList而言,ArrayList在除了在列表中間插入或者刪除元素的情況,其他操作都比TreeList快很多。TreeList的實現是在內部使用了一個樹形的結構來保證所有的插入和刪除動作的復雜度都是O(log n)的。這種實現方式使得TreeList在頻繁插入和刪除元素的時候的性能遠遠高于ArrayList和LinkedList。
1
2
3
4
5
|
class Link { private int id; // data private String name; // data private Link next; // reference to next link } |
HashMap的訪問時間接近穩定,它是一種鍵值對映射的數據結構。這個數據結構是通過數組來實現的。它通過hash函數來給元素定位,并且用沖突檢測算法來處理被hash到同一位置的值。例如,保存雇員的信息可以用雇員的id來作為key,對從properties文件里讀入的屬性-屬性值可以用key/value對來保存,等等。HashMap在初始化的時候,給定一個合適的大小可以減少調整大小的次數。
原文轉自:http://www.importnew.com/871.html