Java 集合的 Set 接口
Set類型與List類型的區別
Set: 無序、不可重復
List: 有序、可重復
1、HashSet
HashSet的存儲結構:HashMap
特點:
HashSet通過比較存放的哈希碼(hashCode)來確定對象存放的位置
當兩個對象的哈希值相等時,HashSet通過對象的equals方法來判斷兩個對象是否相同,如果相同則丟棄該對象
由于判斷元素是否存在的依據是hashCode和equals方法,所以我們在使用時通常重寫類的這兩個方法,來達到自定義對象比較規則的目的。
該比較只實現判斷兩個對象是否相同,從而達到存放不重復的效果,并無排序功能。
重寫hashCode()和equals(Object obj)方法實現對象比較
/*** 重寫hashCode方法*/@Overridepublic inthashCode() {returnID;
}/*** 重寫equals方法,必須在執行hashCode方法得到相同哈希值之后才進入該方法*/@Overridepublic booleanequals(Object obj) {if (this ==obj)return true;if (obj == null)return false;if (getClass() !=obj.getClass())return false;
Student other=(Student) obj;if (ID !=other.ID)return false;return true;
}
習題:已知ArrayList集合s1, 現要實現將s1中重復的元素移除
方法1:
HashSet s2 = new HashSet(s1);
方法2:
HashSet s2 = new HashSet();
s2.addAll(s1);
方法3:
HashSet s2 = new HashSet();for(String string : s1) {
s2.add(string);
}
2、TreeSet
TreeSet使用元素的自然順序對元素進行排序,或者根據創建set時提供的Comparator進行排序。
構造方法
構造一個包含指定 collection 元素的新 TreeSet,它按照其元素的自然順序進行排序。
Comparator super E>?comparator)
構造一個新的空 TreeSet,它根據指定比較器進行排序。該比較器為實現了Comparator接口的類的實體對象。
自然順序的規則
TreeSet使用的元素的自然順序由元素自己提供比較規則。
通常這個比較規則有兩種實現方法:
元素對象實現Comparable接口,并實現接口的CompareTo方法
TreeSet在實例化的時候傳入一個該元素對象的比較器,該比較器實現了Comparator接口,并實現接口的compare方法
實現Comparable接口:
public class Student implements Comparable{
.../*** 重寫Comparable接口的compareTo方法,將o的name屬性與本對象的name屬性對比*/@Overridepublic intcompareTo(Student o) {returnname.compareTo(o.name);
}
}
傳入比較器:
比較器類
public class MyComparator implements Comparator{
@Overridepublic intcompare(Student o1, Student o2) {return o1.getAge() -o2.getAge();
}
}
構造方法
HashSet stuList = new HashSet(new MyComparator());
練習:使用TreeSet對存儲字符串并根據字符串長度排序
代碼實現:
public static voidmain(String[] args) {//實例化TreeSet,并通過匿名類傳入比較器
TreeSet tSet = new TreeSet(new Comparator() {
@Overridepublic intcompare(String o1, String o2) {return o2.length() -o1.length();
}
}
);
tSet.add("asd");
tSet.add("asd1");
tSet.add("asd111");
tSet.add("asd11");
System.out.println(tSet);
}
打印結果:
[asd111, asd11, asd1, asd]