Java集合基礎知識 List/Set/Map詳解
一、List Set 區(qū)別
List 有序,可重復;
Set 無序,不重復;
二、List Set 實現(xiàn)類間區(qū)別及原理
Arraylist 底層實現(xiàn)使用Object[],數(shù)組查詢效率高
擴容機制
- 1.6采用(capacity * 3)/ 2 + 1,默認容量為10;
- 1.7采用(capacity >> 2 + capacity)實現(xiàn),位移動效率高于數(shù)學運算,右移一位等于乘以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 實現(xiàn)原理及實現(xiàn)類對比

1. HashMap 線程不安全,無序
1) 內(nèi)部保存以數(shù)組 HashMap.Entry<K, V>[] 形式
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 在數(shù)據(jù)操作方法上未采用synchronized同步標識,當多線程發(fā)生hash碰撞時,針對hash相等的key只會有一個能成功;
b 如果上面情況涉及到resize擴容情況,每個線程內(nèi)都會對內(nèi)部數(shù)組進行重新創(chuàng)建,但只有一個會成功;
3) 擴容(默認大小為16,2的四次方):
capacity = (capacity * 2 * loadFactor)
loadFactor:系數(shù)因子,默認為0.75,時間與空間的權衡結(jié)果
4) 可通過LinkedHashMap達到有序效果;
2. Hashtable 內(nèi)部原理及使用幾乎等于HashMap,不同的是 所有操作數(shù)據(jù)方法都進行了 synchronized 修飾,即同步處理,線程安全,但這導致單線程訪問情況下效率要低于HashMap;
JDK4將Hashtable實現(xiàn)了Map接口,在JDK5中創(chuàng)建了替代類:ConcurrentHashMap(同步的HashMap)
HashMap想要同步可以采用 java.util.Collections.synchronizeMap(hashMap)(jdk2出現(xiàn));
同理:
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不是;
注:快速失敗模式指設計用來即時報告可能會導致失敗的任何故障情況,通常會用來停止正常的操作而不是嘗試繼續(xù)做可能有缺陷的工作。與iterator有關,如一個iterator在集合對象上創(chuàng)建了,其他線程欲“結(jié)構(gòu)化”的修改此集合對象,會拋出修改異常(ConcurrentModificationException)
3. 建議優(yōu)先考慮使用HashMap
- a. 單線程下效率高;
- b. 想排序可轉(zhuǎn)換LinkedHashMap使用;
- c. 多線程下可采用 Collections.synchronizeMap(hashMap) 代替
以上所述是小編給大家介紹的Java集合基礎知識 List/Set/Map詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- java的各種集合為什么不安全(List、Set、Map)以及代替方案
- 簡單的理解java集合中的HashSet和HashTree幾個重寫方法
- 一分鐘了解Java中List集合與set集合的多種遍歷方式
- Java實現(xiàn)Redis的集合(set)命令操作
- Java HashSet集合存儲遍歷學生對象代碼實例
- Java底層基于鏈表實現(xiàn)集合和映射--集合Set操作詳解
- Java基于二分搜索樹、鏈表的實現(xiàn)的集合Set復雜度分析實例詳解
- Java底層基于二叉搜索樹實現(xiàn)集合和映射/集合Set功能詳解
- Java中的Set集合簡單匯總解析
- Java使用entrySet方法獲取Map集合中的元素
- java集合類源碼分析之Set詳解
- Java concurrency集合之CopyOnWriteArraySet_動力節(jié)點Java學院整理
- Java基礎之集合Set詳解
相關文章
MybatisPlus實現(xiàn)數(shù)據(jù)權限隔離的示例詳解
Mybatis Plus對Mybatis做了無侵入的增強,非常的好用,今天就給大家介紹它的其中一個實用功能:數(shù)據(jù)權限插件,感興趣的可以跟隨小編一起了解下2024-04-04
SpringBoot整合Dubbo框架,實現(xiàn)RPC服務遠程調(diào)用
Dubbo是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調(diào)用,智能容錯和負載均衡,以及服務自動注冊和發(fā)現(xiàn)。今天就來看下SpringBoot整合Dubbo框架的步驟2021-06-06
JavaWeb實現(xiàn)用戶登錄注冊功能實例代碼(基于Servlet+JSP+JavaBean模式)
這篇文章主要基于Servlet+JSP+JavaBean開發(fā)模式實現(xiàn)JavaWeb用戶登錄注冊功能實例代碼,非常實用,本文介紹的非常詳細,具有參考借鑒價值,感興趣的朋友一起看看吧2016-05-05

