Android中需要了解的資料結構(四)

skyxin888發表於2019-05-01

Android中需要了解的資料結構(一)
Android中需要了解的資料結構(二)
Android中需要了解的資料結構(三)

Set介面:

public interface Set<E> extends Collection<E> {}
Set是一個繼承於Collection的介面,Set是一種不包括重複元素的Collection。它維持它自己的內部排序,所以隨機訪問沒有任何意義。它允許null的存在但是僅有一個。由於Set介面的特殊性,所有傳入Set集合中的元素都必須不同。

  • HashSet

        public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable {
          private transient HashMap<E,Object> map;
          private static final Object PRESENT = new Object();
       
          public boolean add(E e) {
              return map.put(e, PRESENT)==null;
          }
      }
    複製程式碼

    HashSet實現Set介面,基於HashMap實現,底層使用HashMap儲存資料。非執行緒安全。

    HashSet是將資料存放到HashMap的Key中,再以PRESENT來作為值,來保證來唯一性。

    HashSet查詢效率很高,它內部元素的順序是由hashcode來決定的,所以它不保證set的迭代順序。

    ArrayList中的兩個元素是否相同,需要重寫equals方法。而對於HashSet,除了要重寫存入物件的equals方法外,還需要重寫hashCode方法,保證HashSet中沒有相同的兩個物件,這點是和HashMap一樣的。

  • LinkedHashSet

          public class LinkedHashSet<E> extends HashSet<E>
              implements Set<E>, Cloneable, java.io.Serializable
    複製程式碼

    LinkedHashSet是HashSet的子類,LinkedHashSet集合同樣是根據元素的hashCode值來決定元素的儲存位置,但是它同時使用連結串列維護元素的次序。這樣使得元素看起 來像是以插入順序儲存的。

    LinkedHashSet內部使用LinkedHashMap實現,所以它和HashSet的關係就相當於HashMap和LinkedHashMap的關係。當遍歷該集合時候,LinkedHashSet將會以元素的新增順序訪問集合的元素。LinkedHashSet在迭代訪問Set中的全部元素時,效能比HashSet好,但是插入時效能稍微遜色於HashSet。

  • TreeSet:

       public class TreeSet<E> extends AbstractSet<E>
          implements NavigableSet<E>, Cloneable, java.io.Serializable{}
    複製程式碼

    TreeSet是二叉樹實現的,基於TreeMap,生成一個總是處於排序狀態的set,內部以TreeMap來實現,不允許放入null值。它是使用元素的自然順序對元素進行排序,或者根據建立Set時提供的 Comparator 進行排序,具體取決於使用的構造方法。

HashSet、LinkedHashSet與TreeSet的區別,應用場景是什麼?

  • HashSet:基於hashMap實現,非執行緒安全,允許插入null,查詢效率高。適合查詢操作頻繁的場景。
  • LinkedHashSet:基於hashCode值來決定元素的儲存位置,但是它同時使用連結串列維護元素的次序。這樣使得元素看起來像是以插入順序儲存的。
  • TreeSet:基於二叉樹實現,非執行緒安全,可以按照自然順序或者自定義順序自動排序,不允許插入null值。適合需要排序的場景。

相關文章