Android中須要瞭解的數據結構(四)

Android中須要瞭解的數據結構(一)
Android中須要瞭解的數據結構(二)
Android中須要瞭解的數據結構(三)java

Set接口:

public interface Set<E> extends Collection<E> {}
Set是一個繼承於Collection的接口,Set是一種不包括重複元素的Collection。它維持它本身的內部排序,因此隨機訪問沒有任何意義。它容許null的存在可是僅有一個。因爲Set接口的特殊性,全部傳入Set集合中的元素都必須不一樣。安全

  • HashSetbash

    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來做爲值,來保證來惟一性。post

    HashSet查找效率很高,它內部元素的順序是由hashcode來決定的,因此它不保證set的迭代順序。性能

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

  • LinkedHashSetspa

    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。code

  • 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值。適合須要排序的場景。
相關文章
相關標籤/搜索