java Map相關總結

dreamcasher發表於2018-08-10

Map

無序儲存,儲存的元素不能重複,如果相等,直接覆蓋。

HashMap

  • 陣列+連結串列+紅黑樹結構,非執行緒安全
  • HashMap儲存值時不是按順序來存,而是按照雜湊值來存,取的時候同樣是按照雜湊值來取。HashMap也是不能存放相同的值,它是通過HashCode()和equals()來判斷,如果HashMap中已存在相同的物件,則覆蓋(這與HashSet不一致,HashSet遇到物件相等則不會儲存)。
  • 物件相等:如果兩個引用指向同一個物件,那麼這兩個引用是相等的,他們的hashcode方法返回的值一致。如果沒有重寫Object中hashcode方法,返回的是物件在記憶體中的地址(值中帶有‘@’)。所以必須要要重寫hashCode()方法,才能使得兩個物件都有相同的hashCode,並且還要重寫equals()方法使得返回的值為true。滿足這兩個條件,那麼證明兩個物件在HashMap/HashSet中是相等的。

ConcurrentHashMap

陣列+連結串列+紅黑樹結構,執行緒安全,是HashMap的執行緒安全版


HashTable

    --extends Dictionary
執行緒安全的,方法上增加了Synchronied,不推薦使用

TreeMap

  • 紅黑樹結構。容器中存放的元素有序(左小右大),且不重複。
  • 有序:Set是無序的,那麼TreeSet是通過什麼來給元素排序的呢?第一種,使用預設的排序規則,即元素實現Comparable介面中的compareTo方法;第二種,使用容器自身的排序規則,初始化時傳入一個Comparator,實現該介面的compare方法。 compare的優先順序高於compareTo。
  • 重複:如何來判斷元素是否重複呢?也是通過compareTo或者comopare方法中的return 0 來判斷。

LinkeHashMap

會儲存插入的順序, 在通過Iterator進行遍歷的時候,先put的元素排在前面。

區分Map相關的集合貌似有點兒困難,記住這幾條黃金法則即可

  •     看到Concurrent的,就想到同步
  •     看到tree,就想到兩個介面:Comoparable、Comparator
  •     看到linked,就想到插入順序
  •     看到hash,就想到hashCode、equals

相關文章