Collection:
ArrayList:
1:底層實現是數組,默認長度是10.
2:add(),判斷是否數組越界,是數組擴容為原來的兩倍。
3:remove(),copy數組,size-1,釋放空虛的空間。
HashSet:
底層實現是一個HashMap,把值存在map的key上,value存的是一個object對象,就是說底層的HashMap中value都是一樣的。
HashSet是無序的,不允許重復。
LinkedHashSet:
基礎自HashSet,底層實現是一個LinkedHashMap,通過equals()方法比較兩個對象是否相等,初始容量16,加載因子0.75f.
使用鏈表維護數據的順序,所有說是有序,不重復的,對象都是存在底層map的key上,所有允許有且只有一個對象為null。
LinkedList:
1.LinkedList基於鏈表實現
2.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為LinkedList要移動指針。
3.對於新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList要移動數據。
4.查找操作indexOf,lastIndexOf,contains等,兩者差不多。
Map:
HashMap:
初始容量值:16,加載因子0.75f.
put()第一個對象的時候,進行初始化,容量16,極限值12,大於極限就要進行擴容。
其底層是一個Entry數組,根據hash值,算法決定object val 對象存在Entry數組的位置。
注意點在用Iterator進行遍歷map的時候,在遍歷過程中不能調用remove()方法,否則會報錯。
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:922)
at java.util.HashMap$EntryIterator.next(HashMap.java:962)
at java.util.HashMap$EntryIterator.next(HashMap.java:960)
原因:
在獲得hashmap的迭代器的時候,構造器中會把expectedModCount = modCount;modCount:(記錄map增加,刪除,modCount+1)
在迭代過程中如何調用remove() or add()方法,modCont+1,在iterator.next()的時候會去比較expectedModCount與modCont是否相等,不等,報錯。
源碼:
LinkedHashMap:
初始容量16,加載因子0.75f.
一個有序的map。繼承HashMap,LinkedHashMap並未重寫父類HashMap的put方法,而是重寫了父類HashMap的put方法調用的子方法void addEntry(int hash, K key, V value, int bucketIndex) 和void createEntry(int hash, K key, V value, int bucketIndex),提供了自己特有的雙向鏈接列表的實現。