標籤:new nbsp 迭代 clear ado 查看 刪除 好的 重複元素
Set集合,它類似於一個罐子,程式可以依次把多個對象 “丟進” Set 集合,而 Set 集合通常不能記住元素的添加的順序,也就是說Set 集合是無序的。Set 集合與 Colleaction 基本相同,沒有提供額外的方法,實際上 Set 就是 Collection,只是行為略有不同(Set 不允許包含重複元素)。
》HashSet
HashSet 類是 Set 介面的典型實作類別,大多數時候使用 Set 集合時就是使用這個實作類別。HashSet 按 Hash 演算法來儲存集合中的元素,因此具有很好的存取和尋找效能。
HashSet 具有以下特點:
》不能保證元素的排列順序,順序可能和添加的順序不同,順序也有可能發生變化。
》HashSetf不是同步的,如果多個線程同時來訪問一個 HashSet,假設有兩個或者兩個以上線程同時修改了HashSet 集合時,則必須通過代碼來保證其同步。
》集合元素值可以是 null。
public static void main(String[] args) { Dog ououDog=new Dog("歐歐","雪納瑞"); Dog yayaDog=new Dog("亞亞","拉布拉多"); Dog meimeiDog=new Dog("美美","雪納瑞"); Dog feifeiDog=new Dog("菲菲","拉布拉多"); Set dogs = new HashSet(); //添加元素 dogs.add(ououDog); dogs.add(yayaDog); dogs.add(meimeiDog); dogs.add(feifeiDog); //遍曆集合中的元素 for (Object item : dogs) { Dog dog=(Dog)item; System.out.println(dog.getName()); } System.out.println(dogs.size()); //查看長度 System.out.println(dogs.isEmpty()); //為空白返回 true ,否則返回 false System.out.println(dogs.contains(feifeiDog)); //指定元素存在返回 true,否則返回false dogs.remove(feifeiDog); //刪除指定元素 dogs.clear(); //清空集合當中的所有元素 }
》LinkedHashSet
HashSet 還有子類 LinkedHashSet, LinkedHashSet 集合也是根據元素的 hashCode 值來決定元素的儲存位置,但它同時使用鏈表維護元素的次序,這樣使得元素看起來是以插入的順序儲存的。也就是說,當遍曆 LinkedHashSet 將會按照添加元素順序來訪問集合裡的元素。
LinkedHashSet 需要維護元素的插入順序,因此效能略低於 HashSet 的效能,但在迭代訪問 Set 裡的全部元素時將有很好的效能,因為它以鏈表來維護內部順序。雖然 LinkedHashSet 使用了鏈表記錄集合元素的添加順序,但 LinkedhasHSet依然是 HashSet,因此它依然不允許集合元素重複。
public static void main(String[] args) { Dog ououDog=new Dog("歐歐","雪納瑞"); Dog yayaDog=new Dog("亞亞","拉布拉多"); Dog meimeiDog=new Dog("美美","雪納瑞"); Dog feifeiDog=new Dog("菲菲","拉布拉多"); Set dogs=new LinkedHashSet(); dogs.add(ououDog); dogs.add(yayaDog); dogs.add(meimeiDog); dogs.add(feifeiDog); for (Object item : dogs) { Dog dog=(Dog)item; System.out.println(dog.getName()); } }
》TreeSet
TreeSet 是 SortedSet 介面的實作類別,正如 SortedSet 名字所暗示的,TreeSet 可以確保集合元素處於排序狀態。與HashSet 相比,TreeSet 還提供了幾個額外的方法。
public static void main(String[] args) { TreeSet nums=new TreeSet(); nums.add(5); nums.add(2); nums.add(10); nums.add(-9); nums.add(15); //自動排序 從小到大 System.out.println(nums); //輸出 [-9, 2, 5, 10, 15] //輸出集合元素的一個元素 System.out.println(nums.first()); //輸出 -9 //輸出集合元素的最後一個元素 System.out.println(nums.last()); //輸出 15 //返回小於 4 的子集,不包含 4 System.out.println(nums.headSet(4)); //輸出[-9, 2] //返回大於 5 的子集,子集中還包含5 System.out.println(nums.tailSet(5)); //輸出[5, 10, 15] //返回大於等於-3 、小於4的子集 System.out.println(nums.subSet(-3, 4)); //輸出[2] //返回小於指定元素 的最大元素,指定元素不需要非得是TreeSet集合裡的元素 System.out.println(nums.lower(11)); //返回大於指定元素的最小元素 System.out.println(nums.higher(3)); //如果 TreeSet 採用了定製排序,則該方法返回定製排序所使用的 Comparator;如果採用自然排序,則返回 null System.out.println(nums.comparator()); }
》各 Set 實作類別的效能分析
HashSet 和 TreeSet 是 Set 的兩個典型實現,到底如何選擇 HashSet 和 TreeSet 呢?HashSet 的效能總是比 TreeSet 好(特比是常用的添加 、查詢元素等操作),因為 TreeSet 需要額外的紅/黑樹狀結構演算法來維護集合元素的次序,只有當需要一個保持排序的 Set 時,才應該使用 TreeSet ,否則都應該使用 HashSet 。
HashSet 還有一個子類 : LinkedHashSet ,對於普通的插入、刪除操作,LinkedHashSet 比 HashSet 要略微慢一點,這是由於維護鏈表所帶來的額外開銷造成的,但由於有了鏈表,遍曆 LinkedHashSet 會更塊。
Java——Set 集合