Android中須要瞭解的數據結構(一)
Android中須要瞭解的數據結構(二)
Android中須要瞭解的數據結構(三)java
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的區別,應用場景是什麼?