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值。適合需要排序的場景。