Set接口與List接口最大的不同在於Set接口中的內容是不允許重複的。同時需要注意的是,Set接口並沒有對Collection接口進行擴充,而List對Collection進行了擴充。因此,在Set接口中沒有get()方法。
在Set子接口中有兩個常用子類:HashSet(無序存儲)、TreeSet(有序存儲)
1.set接口常用字類
範例:觀察HashSet使用
import java.util.HashSet;
import java.util.Set;
public class HashSetDemo {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("hello");
set.add("I'm");
set.add("fish");
set.add("hey");
set.add("Fish");
System.out.println(set);
}
}
範例:觀察TreeSet使用
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
Set<String> set = new TreeSet<>();
set.add("hey");
set.add("Hey");
set.add("I'm");
set.add("Fish");
set.add("fish");
System.out.println(set);
}
}
TreeSet使用的是升序排列的模式完成的。
2.TreeSet排序分析
既然TreeSet子類可以進行排序,所以我們可以利用TreeSet實現數據的排列處理操作。此時要想進行排序實際上是針對於對象數組進行的排序處理,而如果要進行對象數組的排序,對象所在的類一定要實現Comparable接口並且覆寫compareTo()方法,只有通過此方法才能知道大小關係。
需要提醒的是如果現在試用Comparable接口進行大小關係匹配,所有屬性必須全部進行比較操作。
範例:使用TreeSet排序
import java.util.Set;
import java.util.TreeSet;
class Person implements Comparable<Person>{
private String name;
private Integer age;
@Override
public String toString() {
return "Person{" +
"name=" + name +
", age=" + age +
'}';
}
public int compareTo(Person o){
if(this.age > o.age){
return 1;
}else if(this.age < o.age){
return -1;
}else {
return this.name.compareTo(o.name);
}
}
public Person(String name, Integer age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
public class TreeSetDemo1 {
public static void main(String[] args) {
Set<Person> set = new TreeSet<>();
set.add(new Person("張三",20));
set.add(new Person("王五",15));
set.add(new Person("趙四",18));
System.out.println(set);
}
}
在實際使用之中,使用TreeSet過於麻煩了。項目開發之中,簡單java類是根據數據表設計得來的,如果一個類的屬性很多,那麼比較起來就很麻煩了。所以我們一般使用的是HashSet。
3.重複元素判斷
在使用TreeSet子類進行數據保存的時候,重複元素的判斷依靠的ComParable接口完成的。但是這並不是全部Set接口判斷重複元素的方式,因爲如果使用的是HashSet子類,由於其跟Comparable沒有任何關係,所以它判斷重複元素的方式依靠的是Object類中的兩個方法:
- hash碼: public native int hashCode();
- 對象比較:public boolean equals(Object obj);
在Java中進行對象比較的操作有兩步:第一步要通過一個對象的唯一編碼找到一個對象的信息,當編碼匹配之後再調用equals()方法進行內容的比較。
範例:覆寫hashCode()與equals()方法消除重複
如果要想標識出對象的唯一性,一定需要equals()與hashCode()方法共同調用。
面試題:如果兩個對象的hashCode()相同,equals()不同結果是什麼?不能消除
面試題:如果兩個對象的hashCode()不同,equals()相同結果是什麼?不能消除
對象判斷必須兩個方法equals()、hashCode()返回值都相同才判斷爲相同。
個人建議:
- 保存自定義對象的時候使用List接口;
- 保存系統類信息的時候使用Set接口(避免重複)。