天天看點

Java基礎Map和Set

有哪些Map的實作? HashMap 、 Hashtable 、 LinkedHashMap 、 TreeMap 、 ConcurrentHashMap HashMap和Hashtable 的差別? HashMap :底層是基于數組 + 連結清單, ⾮線程安全的 ,預設容量是 16 、允許有空的健和值。 Hashtable :基于哈希表實作, 線程安全 的 ( 加了 synchronized) ,預設容量是 11 ,不允許有 null 的健和值。 HashMap和TreeMap應該怎麼選擇?使⽤場景 hashMap: 散列桶 ( 數組 + 連結清單 ) ,可以實作快速的存儲和檢索,但是确實包含⽆序的元素,适⽤于在 map中插⼊删除和定位元素 treeMap: 使⽤存儲結構是⼀個平衡⼆叉樹中的 紅⿊樹,可以⾃定義排序規則,要實作 Comparator 接 ⼝。 能便捷的實作内部元素的各種排序,但是⼀般性能⽐ HashMap 差,适⽤于安裝⾃然排序或者⾃定義排序規則 (寫過微信⽀付簽名⼯具類就⽤這個類 )。 Set和Map的關系 核⼼就是不儲存重複的元素,存儲⼀組唯⼀的對象 set 的每⼀種實作都是對應 Map ⾥⾯的⼀種封裝, new HashSet()對象底層對應的就是new  HashMap() ,new T reeSet()底層 對應的就是new T reeMap()。

set是一種關聯式容器,其特性如下:

  • set以RBTree作為底層容器
  • 所得元素的隻有key沒有value,value就是key
  • 不允許出現鍵值重複
  • 所有的元素都會被自動排序
  • 不能通過疊代器來改變set的值,因為set的值就是鍵

map和set一樣是關聯式容器,它們的底層容器都是紅黑樹,差別就在于map的值不作為鍵,鍵和值是分開的。它的特性如下:

  • map以RBTree作為底層容器
  • 所有元素都是鍵+值存在
  • 不允許鍵重複
  • 所有元素是通過鍵進行自動排序的
  • map的鍵是不能修改的,但是其鍵對應的值是可以修改的

常⻅Map的排序規則是怎樣的? 按照添加順序使⽤ LinkedHashMap ,按照⾃然排序使⽤ TreeMap ,⾃定義排序 TreeMap(Comparetor c)