1. 程式人生 > >Java集合深入學習--HashSet與TreeSet

Java集合深入學習--HashSet與TreeSet

Set特點:集合中不允許有重複物件

HashSet:

一個基於HashMap的Set實現。其中,所有的值為“假值”(同一個Object物件,具備和HashMap同樣的效能。基於這個特性,這個資料結構會消耗更多不必要的記憶體。

public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
PRESENT為HashSet中靜態常量,所有HashSet元素的value值都指向一個Object物件。
Set中允許新增null物件。

使用HashSet需要定義元素物件的hashCode()和equals()方法,分別用來生成雜湊碼和比較物件是否相同。如果不自定義這兩個方法,會呼叫Object的方法,實現如下:

public native int hashCode();
public boolean equals(Object obj) {
        return (this == obj);
    }
hashCode是呼叫其他語言庫實現的,equals方法直接比較兩個物件的引用是否是同一個。

向HashSet中新增物件時,會呼叫這兩個方法,只有當兩者都相同時才會判斷為相同元素。HashSet的儲存方式在HashMap中敘述。

由於雜湊的存在,HashSet無法儲存元素的存入順序,HashSet也不能對其中的元素進行排序

Entry(int h, K k, V v, Entry<K,V> n) {
            value = v;
            next = n;
            key = k;
            hash = h;
        }
EnumSet:

值為列舉型別的Set。Java的每一個enum都對映成一個不同的int。這就允許使用BitSet——一個類似的集合結構,其中每一位元都對映成不同的enum。EnumSet有兩種實現,RegularEnumSet——由一個單獨的long儲存(能夠儲存64個列舉值,99.9%的情況下是夠用的),JumboEnumSet——由long[]儲存。

BitSet:

一個位元Set。需要時常考慮用BitSet處理一組密集的整數Set(比如從一個預先知道的數字開始的id集合)。這個類用 long[]來儲存bit。

LinkedHashSet:

繼承了HashSet,這個類基於LinkedHashMap實現。這是唯一一個保持了插入順序

的Set。具體描述見LinkedHashMap。

TreeSet:

這是一個基於TreeMap的實現,這是在單執行緒部分唯一一個排序的Set。具體描述見TreeMap。