一、List 和 Set 區別html
- List
- 能夠容許重複的對象。
- 能夠插入多個null元素。
- 有序容器
- Set
- 不容許重複的對象。
- 只能插入1個null元素
- 無序容器,可使用TreeSet實現有序
二、Set和hashCode以及equals方法的聯繫數組
set集合中存放的數據有一個特色,那就是無序且不重複。無序是由於set集合中的元素沒有下座標。不重複的緣由就是由於set集合中有hashcode與equals這兩個方法。安全
三、List 和 Map 區別數據結構
- 結構:List爲單列結構,Map爲雙列結構
- 重複性:List爲能夠重複,Map爲雙列集合(key-value),key不能夠重複
- 有序性:List爲有序集合,Map的key是無序的
四、Arraylist 與 LinkedList 區別多線程
- 數據結構:ArrayList基於動態數組的數據結構。LinkedList基於鏈表的數據結構。
- 操做性:ArrayList查詢快,增刪慢,LinkedList查詢慢,增刪快。
五、ArrayList 與 Vector 區別併發
- 同步性:Vector線程安全,用synchronized實現線程安全。ArrayList線程不安全。
- 數據容量增加:兩者都有一個初始容量大小,採用線性連續存儲空間,當存儲的元素的個數超過了容量時,就須要增長兩者的存儲空間,Vector增加原來的一倍,ArrayList增長原來的0.5倍。
六、HashMap 和 Hashtable 的區別高併發
- 繼承不一樣父類:Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類。但兩者都實現了Map接口。
- 線程安全:Hashtable線程安全,HashMap線程不安全。
- 是否提供contains方法: HashMap把Hashtable的contains方法去掉了,改爲containsValue和containsKey。Hashtable則保留了contains,containsValue和containsKey三個方法,其中contains和containsValue功能相同。
- key和value的是否能夠爲null值:Hashtable中,key和value都不容許出現null值。HashMap中,null能夠做爲鍵,這樣的鍵只有一個;能夠有一個或多個鍵所對應的值爲null。
七、HashSet 和 HashMap 區別性能
*HashMap* |
*HashSet* |
HashMap實現了Map接口 |
HashSet實現了Set接口 |
HashMap儲存鍵值對 |
HashSet僅僅存儲對象 |
使用put()方法將元素放入map中 |
使用add()方法將元素放入set中 |
HashMap中使用鍵對象來計算hashcode值 |
HashSet使用成員對象來計算hashcode值,對於兩個對象來講hashcode可能相同,因此equals()方法用來判斷對象的相等性,若是兩個對象不一樣的話,那麼返回false |
HashMap比較快,由於是使用惟一的鍵來獲取對象 |
HashSet較HashMap來講比較慢 |
八、HashMap 和 ConcurrentHashMap 的區別spa
- 線程安全性:HashMap線程不安全,ConcurrentHashMap線程安全
- ConcurrentHashMap特性:性能與安全性兼得。加入分段鎖的概念,至關於一個大集合,根據hashcode值分紅多個hashtable,根據key.hashCode()來決定把key放到哪一個HashTable中。
九、HashMap 的工做原理及代碼實現,何時用到紅黑樹.net
- 工做原理:經過hash的方法,經過put和get存儲和獲取對象。存儲對象時,咱們將K/V傳給put方法時,它調用hashCode計算hash從而獲得bucket位置,進一步存儲,HashMap會根據當前bucket的佔用狀況(當鍵值對的數量大於容量(capacity)*負載因子(load factor 默認值0.75)時)自動調整容量(超過Load Facotr則resize爲原來的2倍)。獲 取對象時,咱們將K傳給get,它調用hashCode計算hash從而獲得bucket位置,並進一步調用equals()方法肯定鍵值對。若是發生碰撞的時候,Hashmap經過鏈表將產生碰撞衝突的元素組織起來,在Java 8中,若是一個bucket中碰撞衝突的元素超過某個限制(默認是8),則使用紅黑樹來替換鏈表,從而提升速度。
- 代碼實現:參考 http://www.cnblogs.com/mzc-blogs/p/5800084.html, 也能夠直接查看源碼
- 何時用到紅黑樹:當鏈表(bucket)的數量大於8時,後面的使用紅黑樹。使用紅黑樹增長檢索的速度。
十、多線程狀況下HashMap死循環的問題
- 緣由:HashMap是採用鏈表解決Hash衝突,由於是鏈表結構,那麼就很容易造成閉合的鏈路(緣由:多線程操做時,可能會有兩個或以上的線程同時觸發rehash--從新計算hash值--操做,容易形成閉合的鏈路),這樣在循環的時候只要有線程對這個HashMap進行get操做就會產生死循環。
- 解決思路:用ConcurrentMap代替HashMap
十一、HashMap出現Hash DOS攻擊的問題
十二、ConcurrentHashMap 的工做原理及代碼實現,如何統計全部的元素個數
- ConcurrentHashMap工做原理:容器中有多把鎖,每一把鎖鎖一段數據,這樣在多線程訪問時不一樣段的數據時,就不會存在鎖競爭了,這樣即可以有效地提升併發效率。這就是ConcurrentHashMap所採用的"分段鎖"思想。
- 代碼實現:參考https://www.cnblogs.com/chengxiao/p/6842045.html 或查看源碼
- 如何統計全部的元素個數:size()
1三、手寫簡單的HashMap
參考: https://blog.csdn.net/lishaoran369/article/details/61920036