一、list set 區別
list 有序,可重復;
set 無序,不重復;
二、list set 實現類間區別及原理
arraylist 底層實現使用object[],數組查詢效率高
擴容機制
- 1.6采用(capacity * 3)/ 2 + 1,默認容量為10;
- 1.7采用(capacity >> 2 + capacity)實現,位移動效率高于數學運算,右移一位等于乘以2倍;
讀取速度快,寫入會涉及到擴容,所以相對較慢。
linkedlist底層采用雙向鏈表,只記錄 first 和 last(linkedlist.node);
node記錄 e item; node<e> next; node<e> prev;
寫入速度快,但是讀取速度相對較慢;
hashset 無序,不重復。
去重原理:所有值保存至hashmap的key中,利用hashmap的鍵不重復原理達到去重效果;
arraylist去重可采用:new arraylist(new hastset(list));
treeset 有序,不重復。
底層采用treemap;
三、map 實現原理及實現類對比
1. hashmap 線程不安全,無序
1) 內部保存以數組 hashmap.entry<k, v>[] 形式
1
2
3
4
5
6
7
8
9
10
11
12
13
|
static class entry<k, v> implements map.entry<k, v> { final k key; v value; entry<k, v> next; int hash; entry( int h, k k, v v, entry<k, v> n) { value = v; next = n; key = k; hash = h; } } |
2) 線程不安全原因:
a 在數據操作方法上未采用synchronized同步標識,當多線程發生hash碰撞時,針對hash相等的key只會有一個能成功;
b 如果上面情況涉及到resize擴容情況,每個線程內都會對內部數組進行重新創建,但只有一個會成功;
3) 擴容(默認大小為16,2的四次方):
capacity = (capacity * 2 * loadfactor)
loadfactor:系數因子,默認為0.75,時間與空間的權衡結果
4) 可通過linkedhashmap達到有序效果;
2. hashtable 內部原理及使用幾乎等于hashmap,不同的是 所有操作數據方法都進行了 synchronized 修飾,即同步處理,線程安全,但這導致單線程訪問情況下效率要低于hashmap;
jdk4將hashtable實現了map接口,在jdk5中創建了替代類:concurrenthashmap(同步的hashmap)
hashmap想要同步可以采用 java.util.collections.synchronizemap(hashmap)(jdk2出現);
同理:
collections.synchronizecollection(collection<t> c)
collections.synchronizelist(list<t> list)
collections.synchronizeset(set<t> s)
collections.synchronizesortedmap(sortedmap<k, v> m)
collections.synchronizesortedset(sortedset<t> s)
迭代hashmap采用快速失敗機制,而hashtable不是;
注:快速失敗模式指設計用來即時報告可能會導致失敗的任何故障情況,通常會用來停止正常的操作而不是嘗試繼續做可能有缺陷的工作。與iterator有關,如一個iterator在集合對象上創建了,其他線程欲“結構化”的修改此集合對象,會拋出修改異常(concurrentmodificationexception)
3. 建議優先考慮使用hashmap
- a. 單線程下效率高;
- b. 想排序可轉換linkedhashmap使用;
- c. 多線程下可采用 collections.synchronizemap(hashmap) 代替
以上所述是小編給大家介紹的java集合基礎知識 list/set/map詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:https://www.cnblogs.com/bearhoney/p/10499927.html