一.了解Map集合嗎?Map集合都有哪些實現
1.HashMap HashTable LinkedHashMap TreeMap ConcurrentHashMap
二.HashMap和HashTable之間的區別
1.HashMap:底層基於數組+單向鏈表(紅黑樹),非線程安全,默認容量為16,允許有空的鍵和值
數組:Node<K,V> [] table ,每一個元素都是一個Node
單向鏈表:Node<K,V> next,當發生Hash碰撞,會追加鏈表,當鏈表長度大於8,那就轉換為紅黑樹
2.HashTable:底層基於哈希表實現,線程是安全的,默認容量為11,不允許有空的鍵和值
三.hashCode()和equals()方法使用場景
hashCode():頂級父類Object當中的方法,返回值類型為int類型的值,根據一定的規則(存儲地址,字段,長度等等)生成一個數組,數據保存的就是Hash值
equals():頂級類Object中的方法,根據一定的比較規則,判斷對象是否一致,底層一般邏輯:
1.判斷兩個對象的內存地址是否一樣
2.非空判斷和Class類型判斷
3.強轉
4.對象中的字段一一匹配
四.HashMap和TreeMap應該如何選擇
HashMap:底層采用數組+鏈表(紅黑樹)結構,可以實現快速的存儲和檢索,但是數據是無序的,適用於在Map當中插入刪除或者獲取元素
TreeMap: 存儲結構是一個平衡二叉樹,具體實現方式為紅黑樹,默認采用自然排序,可以自定義排序規則,但是需要實現Comparator接口
能夠便捷的實現內部元素的各種排序,但是性能比HashMap差,適用於按照自然排序和自定義排序規則
五.Set和Map的關系
Set核心就是保存不重復的元素,存儲一組唯一的對象
set當中每一種實現都對應Map
HashSet對應的HashMap,TreeSet對應的TreeMap
六.常見的Map排序規則
按照添加規則使用LinkedHashMap,按照自然排序或者自定義規則排序可以采用TreeMap
七.如何保證Map線程安全
多線程環境下,可以使用concurrent包下有一個ConcurrentHashMap或者是使用Collections.synchronizedList(new HashMap<K,V>());
ConcurrentHashMap保證線程安全,效率比HashTable高
JDK1.7版本:ReentrantLock+Segment+HashEntry
JDK1.8版本:synchronized+CAS+HashEntry+紅黑樹