Set接口
Set不允許包含相同的元素,如果試圖把兩個相同元素加入同一個集合中,add方法返回false。
Set判斷兩個對象相同不是使用==運算符,而是根據equals方法。也就是說,只要兩個對象用equals方法比較返回true,Set就不 會接受這兩個對象。
HashSet: 順序是不確定性的.
LinkedHashSet:按照輸入的順序進行輸出.
TreeSet:SortedSet 接口的唯一實現類,保證集合元素處於排序狀態.
1、HashSet
HashSet有以下特點
不能保證元素的排列順序,順序有可能發生變化
不是同步的
集合元素可以是null,但只能放入一個null
當向HashSet結合中存入一個元素時,HashSet會調用該對象的hashCode()方法來得到該對象的hashCode值,然後根據 hashCode值來決定該對象在HashSet中存儲位置。
簡單的說,HashSet集合判斷兩個元素相等的標準是兩個對象通過equals方法比較相等,並且兩個對象的hashCode()方法返回值相 等
注意,如果要把一個對象放入HashSet中,重寫該對象對應類的equals方法,也應該重寫其hashCode()方法。其規則是如果兩個對 象通過equals方法比較返回true時,其hashCode也應該相同。另外,對象中用作equals比較標準的屬性,都應該用來計算 hashCode的值。
/** * HashSet. * 輸出的順序是不定. */ @Test public void HashSetTest() { HashSet<String> va = new HashSet<String>(); va.add("aa"); va.add("cc"); va.add("bb"); va.add("ab"); va.add("bc"); va.add("ca"); for (int i = 0; i < va.toArray().length; i++) { System.out.println(va.toArray()[i] + " : " + va.toArray()[i].hashCode()); } }
2、LinkedHashSet
LinkedHashSet集合同樣是根據元素的hashCode值來決定元素的存儲位置,但是它同時使用鏈表維護元素的次序。這樣使得元素看起 來像是以插入順序保存的,也就是說,當遍歷該集合時候,LinkedHashSet將會以元素的添加順序訪問集合的元素。
LinkedHashSet在迭代訪問Set中的全部元素時,性能比HashSet好,但是插入時性能稍微遜色於HashSet。
/** LinkedHashSetTest. * 按輸入順序輸出. */ @Test public void LinkedHashSetTest() { LinkedHashSet<String> linkSet = new LinkedHashSet<String>(); linkSet.add("aa"); linkSet.add("cc"); linkSet.add("bb"); linkSet.add("ab"); linkSet.add("bc"); linkSet.add("ca"); for (int i = 0; i < linkSet.toArray().length; i++) { System.out.println(linkSet.toArray()[i] + " : " + linkSet.toArray()[i].hashCode()); } }
3、TreeSet類
TreeSet是SortedSet接口的唯一實現類,TreeSet可以確保集合元素處於排序狀態。TreeSet支持兩種排序方式,自然排序 和定製排序,其中自然排序爲默認的排序方式。向TreeSet中加入的應該是同一個類的對象。
TreeSet判斷兩個對象不相等的方式是兩個對象通過equals方法返回false,或者通過CompareTo方法比較沒有返回0
自然排序
自然排序使用要排序元素的CompareTo(Object obj)方法來比較元素之間大小關係,然後將元素按照升序排列。
Java提供了一個Comparable接口,該接口裏定義了一個compareTo(Object obj)方法,該方法返回一個整數值,實現了該接口的對象就可以比較大小。
obj1.compareTo(obj2)方法如果返回0,則說明被比較的兩個對象相等,如果返回一個正數,則表明obj1大於obj2,如果是 負數,則表明obj1小於obj2。
如果我們將兩個對象的equals方法總是返回true,則這兩個對象的compareTo方法返回應該返回0
定製排序
自然排序是根據集合元素的大小,以升序排列,如果要定製排序,應該使用Comparator接口,實現 int compare(T o1,T o2)方法
/** TreeSet. 輸出是有序的. * 生成的hoshcode值是有順序的. * 不使用 Comparator排序爲自然排序.按從小到大的次序. */ @Test public void TreeSetTest() { TreeSet<String> treeSet = new TreeSet<String>(new DescOrder()); treeSet.add("aa"); treeSet.add("cc"); treeSet.add("bb"); treeSet.add("ab"); treeSet.add("bc"); treeSet.add("ca"); for (int i = 0; i < treeSet.toArray().length; i++) { System.out.println(treeSet.toArray()[i] + " : " + treeSet.toArray()[i].hashCode()); } }
使用 Comparator方法進行控制排序的樣式,從大到小還是從小打到.
/** Comparator. * 使用 Comparator方法進行選擇排序,可以從小到大,從大到小的次序. */ class DescOrder implements Comparator<String> { @Override public int compare(String o1, String o2) { /** 從大到小次序. */ return -o1.compareTo(o2); /** 從小到大次序. */ //return -o1.compareTo(o2); } }