java Set相關總結

dreamcasher發表於2018-08-09

Set

無序儲存,獨一無二(值不能重複)

HashSet

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

TreeSet

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

LinkedHashSet

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

區分這些集合的特點貌似有點困難,但是隻要記住這幾條黃金規則即可:

  • 看見array就想到下標
  • 看見hash就想到hashCode和equals
  • 看見tree就想到實現有序的兩個介面:Comparable和Comparator
  • 看見linked就想到first和last

相關文章