1、畫出collection的框架圖
集合主要包含collection和map兩個接口。其中collection中的元素是一個value值,map中的元素是key:value形式的。
collection包含set、list、queue。
(1)list:list接口包含ArrayList,Vector,LinkedList。
(2)set包含HashSet,TreeSet,EnumSet。
(3)Queueu包含LinkedList,PriorityQueue
map包含HashMap,HashTable,TreeMap,WeakHashMap,IdentityHashMap,EnumMap
2、詳述List、Map、Set的區別?(底層實現的數據結構不同)
(1)List:有序,可重復。
ArrayList:底層實現的數據結構是數組,查詢快,增刪慢。線程不安全,效率高
LinkedList:底層實現的數據結構是鏈表,查詢慢,增刪塊。線程不安全,效率高
Vector:底層實現的數據結構是數組,查絢塊,增刪慢。線程安全,效率低。
(2)Set:無序,唯一。
HashSet:底層數據結構是哈希表(無序,唯一)。保證元素唯一性依賴於兩個方法:hashCode()和equals()
LinkedHashSet:底層數據結構是鏈表和哈希表。(FIFO,有序,唯一)。通過鏈表保證有序性, 通過哈希表保證唯一性。
TreeSet:底層數據結構是紅黑樹。(唯一,有序)
一般。ArrayList和HashSet用的比較廣泛。如果明確知道需要線程安全或者有序,就根據集合的具體特點選擇使用哪一個集合。Set和List都是單列元素的集合,父接口都是Colelction,有一定的相似之處。
List表示有先后順序的集合, 按元素先來后到的元素進行插入,當然,可以插隊,使用add(int index,object e)指定元素的位置。其實並不是把對象本身存儲在集合里,而是在集合中用一個索引變量指向這個對象,當集合中包含多個同樣的對象時,是多個索引指向同一個對象。List除了可以以Iterator接口取得所有的元素,再逐一遍歷各個元素之外,還可以調用get(index i)來明確說明取第幾個。
Set里面不允許有重復的元素,即不能有兩個相等(注意,不是僅僅是相同equals)的對象。所以,Set集合的add方法有一個boolean的返回值,當集合中沒有某個元素,此時add方法可成功加入該元素時,則返回true,當集合含有與某個元素equals相等的元素時,此時add方法無法加入該元素,返回結果為false。Set取元素時,沒法說取第幾個,只能以Iterator接口取得所有的元素,再逐一遍歷各個元素。
(3)Map中常用的是Hash Map,HashMap,HashTable,TreeMap。
TreeMap:有序
HashMap:無序,線程不安全,效率高
HashTable:無序,線程安全,效率低。
HashMap和hashTable的區別:
Hashtable不允許null值,HashMap允許null值(key和value都允許)
Hashtable是Java1.1的一個類,它基於陳舊的Dictionary類。而HashMap是Java1.2引進的Map接口的一個實現。
Hashtable是線程安全的,而HashMap是線程不安全的。如果對同步性或與遺留代碼的兼容性沒有任何要求,建議使用HashMap。 查看Hashtable的源代碼就可以發現,除構造函數外,Hashtable的所有 public 方法聲明中都有 synchronized關鍵字,而HashMap的源碼中則沒有。
Map和List、Set不同,是雙列元素的集合,不允許重復的key(equals),通過put(obj key,obj value)將元素存儲到map集合中。取值時通過get(Object key),或者通過map.keySet(),map.values(),map.entrySet()獲得keys,values的信息。
總結:List 以特定次序來持有元素,可有重復元素。Set 無法擁有重復元素,內部排序。Map 保存key-value值,value可多值。
3、List時如何擴容的?
lsit初始化的長度是10,當長度達到10時,再新增數據會進行擴容。每次擴容為1.5倍+1,並將之前的數據copy到新的array中去。發現不同jdk是不一樣的,關於(1.5倍+1)出現在jdk1.6,其他1.7和1.8都是(1.5倍擴容)。
4、HashSet的底層實現是?
HashMap,主要利用了HashMap的鍵不可重復的特性。
5、Iterator的機制?