Java集合面試題:[1]集合面試題、Java集合

來源:酷知科普網 1.52W

包中就包含了一系列重要的集合類,而對於集合類,主要需要掌握的就是它的內部結構,以及遍歷集合的迭代模式
Java2的集合框架,抽其核心,主要有三種:List、Set和Map。
如下圖所示:

Java集合面試題:[1]集合面試題、Java集合
Java集合面試題:[1]集合面試題、Java集合 第2張

操作方法

(01)集合類特性(幾個常用類的區別)ArrayList:元素單個,效率高,多用於查詢Vector:元素單個,執行緒安全,多用於查詢LinkedList:元素單個,多用於插入和刪除HashMap:元素成對,元素可為空HashTable:元素成對,執行緒安全,元素不可為空WeakHashMap:是一種改進的HashMap,它對key實行“弱引用”,如果一個key不再被外部所引用,那麼該key可以被GC回收

(02)Iterator 是什麼一些集合類提供了內容遍歷的功能,通過ator介面。這些介面允許遍歷物件的集合。依次操作每個元素物件。當使用Iterators時,在獲得Iterator的時候包含一個集合快照。通常在遍歷一個Iterator的時候不建議修改集合本省。Iterator與ListIterator有什麼區別ator可用來遍歷Set和List集合,但是ListIterator只能用來遍歷List。 ator只能正向遍歷集合,適用於獲取移除元素。ListIerator繼承Iterator,可以雙向列表的遍歷,同樣支援元素的修改。比如:增加元素,替換元素,獲取前一個和後一個元素的索引,等等。

(03)Collection 和 Collections的區別Collection是集合類的上級介面,繼承與他的介面主要有Set 和ections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作List、Map、Set三個介面,存取元素時,各有什麼特點List以特定次序來持有元素,可有重複元素;Set無法擁有重複元素,內部排序(無序);Map儲存key-value值,value可多值。

Java集合面試題:[1]集合面試題、Java集合 第3張

(04)HashMap和Hashtable的區別都屬於Map介面的類,實現了將惟一鍵對映到特定的值上。一.歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map介面的一個實現二.同步性:Hashtable是執行緒安全的,也就是說是同步的,而HashMap是執行緒序不安全的,不是同步的三.值:HashMap 類沒有分類或者排序。它允許一個 null 鍵和多個 null 值。Hashtable 類似於 HashMap,但是不允許 null 鍵和 null 值。四.效率:Hashtable 比 HashMap 慢,因為它是同步的。怎樣使HashMap同步HashMap可以通過Map m = hronizedMap(hashMap)來達到同步的效果。

(05)ArrayList和Vector的區別ArrayList與Vector主要從二方面來說.一.同步性:Vector是執行緒安全的,也就是說是同步的,而ArrayList是執行緒序不安全的,不是同步的。二.操作:由於Vector支援多執行緒操作,所以在效能上就比不上ArrayList了。三.資料增長:ArrayList和Vector都有一個初始的容量大小,當儲存進去它們裡面的元素個數超出容量的時候,就需要增加ArrayList和Vector的儲存空間,每次增加儲存空間的時候不是隻增加一個儲存單元,是增加多個儲存單元。Vector預設增加原來的一倍,ArrayList預設增加原來的0.5倍。Vector可以由我們自己來設定增長的大小,ArrayList沒有提供相關的方法。LinkedList與ArrayList有什麼區別兩者都實現的是List介面,不同之處在於:(1)、ArrayList是基於動態陣列實現的,LinkedList是基於連結串列的資料結構。(2)、get訪問List內部任意元素時,ArrayList的效能要比LinkedList效能好。LinkedList中的get方法是要按照順序從列表的一端開始檢查,直到另一端(3)、對於新增和刪除操作LinkedList要強於ArrayList,因為ArrayList要移動資料附加:LinkedList實現了List介面,允許null元素。此外LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆疊(stack),佇列(queue)或雙向佇列(deque)。注意LinkedList沒有同步方法。如果多個執行緒同時訪問一個List,則必須自己實現訪問同步。一種解決方法是在建立List時構造一個同步的List:List list = hronizedList(new LinkedList(…));

(06)陣列(Array)和列表集合(ArrayList)有什麼區別下面列出了Array和ArrayList的不同點:Array可以包含基本型別和物件型別,ArrayList只能包含物件型別。Array大小是固定的,ArrayList的大小是動態變化的。ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()  等等。對於基本型別資料,集合使用自動裝箱來減少編碼工作量。但是,當處理固定大小的基本資料型別的時候,這種方式相對比較慢。Enumeration介面和Iterator介面的區別有哪些Enumeration速度是Iterator的2倍,同時佔用更少的記憶體。但是,Iterator遠遠比Enumeration安全,因為其他執行緒不能夠修改正在被iterator遍歷的集合裡面的物件。同時,Iterator允許呼叫者刪除底層集合裡面的元素,這對Enumeration來說是不可能的。

(07)HashSet和TreeSet有什麼區別HashSet有以下特點:A. 無序(不能保證元素的排列順序,順序有可能發生變化)B. 不同步C. 允許空值(集合元素可以是null,可以放入多個null,但會自動覆蓋)當向HashSet結合中存入一個元素時,HashSet會呼叫該物件的hashCode()方法來得到該物件的hashCode值,然後根據 hashCode值來決定該物件在HashSet中儲存位置。簡單的說,HashSet集合判斷兩個元素相等的標準是兩個物件通過equals方法比較相等,並且兩個物件的hashCode()方法返回值相 等注意,如果要把一個物件放入HashSet中,重寫該物件對應類的equals方法,也應該重寫其hashCode()方法。其規則是如果兩個物件通過equals方法比較返回true時,其hashCode也應該相同。另外,物件中用作equals比較標準的屬性,都應該用來計算 hashCode的值。TreeSet有以下特點:A. 有序1. TreeSet是由一個樹形的結構來實現的(資料結構是二元樹),它裡面元            素是有序的Set是SortedSet介面的唯一實現類,TreeSet可以確保集合元素處於           排序狀 態,支援兩種排序方式,自然排序和定製排序。其中自然排序為             預設的排序方式;定製排序,TreeSet中的物件元素需要實Comparable             介面TreeSet類中跟HashSet類一樣也沒有get()方法來獲取列表中的元素,所以      也只能通過迭代器方法來獲取二元樹:B. 不允許空值1. HashSet是通過HashMap實現的,TreeSet是通過TreeMap實現的,只不過            Set用的只是Map的key2. Map的key和Set都有一個共同的特性就是集合的唯一性Map更是              多 了一個有序性.3. TreeSet類中跟HashSet類一樣也沒有get()方法來獲取列表中的元素,所            以也只能通過迭代器方法來獲取4. HashSet是基於hash演算法實現的,效能優於TreeSet,通常使用                        HashSet。在我們需要對其中元素排序的時候才使用TreeSet。

Java集合面試題:[1]集合面試題、Java集合 第4張

(08)HashMap,LinkedMap,TreeMap的區別HashMap,LinkedHashMap,TreeMap都屬於Map。LinkedHashMap是HashMap的子類。Map 主要用於儲存鍵(key)值(value)對,根據鍵得到值,因此鍵不允許鍵重複,但允許值重複Map的內部結構是一個數組,線性順序儲存,二次結構使用線性的單鏈表。使用key的hashCode做二次hash之後,再擷取小於陣列長度的值為索引值。key可以為null,存在索引為0的位置上。由於使用了陣列,所以有一個負載因子loadFactor的概念(臨界閾值threshold)和resize。resize比較耗時,衝突時鏈式遍歷查詢也比較耗時,所以選定一個合適的初始容易比較重要。存取效能都較高。迭代遍歷時一維使用陣列,二維使用連結串列。HashMap是一個最常用的Map,它根據鍵的HashCode 值儲存資料,根據鍵可以直              接獲取它的值,具有很快的訪問速度。HashMap最多隻允許一條記錄的            鍵為Null;允許多條記錄的值為 Null;HashMap不支援執行緒的同步,即任             一 時刻可以有多個執行緒同時寫HashMap;可能會導致資料的不一致。如             果需要同步,可以用 Collections的synchronizedMap方法使HashMap           具有同步的能力。edHashMap是HashMap的子類。內部結構是一個數組,線性順序儲存,二次結構使用線性的單鏈表,但同時內部維護了一個雙向迴圈連結串列,可以保持順序。access-order=false預設為使用新增儲存順序,access-order=true則指定使用讀取和訪問順序。removeEldestEntry=false(當指定為true時,就是實現LRU演算法的快取容器,當然要指定淘汰時的使用頻率和容量上限,其實是一個最近最少使用-->最近使用access-order=true/最新儲存access-order=false)。存取效能較HashMap差-些,但相差不大。r為尾方向,re為首方向。迭代遍歷時entrySet()ator()跟HashMap一樣(有點困惑,為什麼不按線性順序進行迭代,只能重寫entrySet(),keySet()和values()方法)。適用於有快取設計需求的情況(需繼承)。Map的內部結構是一棵紅黑樹(又叫排序數,是二元樹的一種),使用鏈式儲存,可以指定比較器Comparator,key需實現Comparable介面。key不能為null。存結點效能稍差,因為需要調整樹結構;取結點用的是連結串列遍歷,但是屬於有序比較,效能中等。迭代遍歷時用的樹的中序遍歷,是一個有序序列。適用於有排序需求的情況。

熱門標籤