java集合框架————Set集合接口

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類中的兩個方法:

  1. hash碼: public native int hashCode();
  2. 對象比較:public boolean equals(Object obj);

在Java中進行對象比較的操作有兩步:第一步要通過一個對象的唯一編碼找到一個對象的信息,當編碼匹配之後再調用equals()方法進行內容的比較。

範例:覆寫hashCode()與equals()方法消除重複
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
如果要想標識出對象的唯一性,一定需要equals()與hashCode()方法共同調用。
面試題:如果兩個對象的hashCode()相同,equals()不同結果是什麼?不能消除
面試題:如果兩個對象的hashCode()不同,equals()相同結果是什麼?不能消除

對象判斷必須兩個方法equals()、hashCode()返回值都相同才判斷爲相同。

個人建議:

  1. 保存自定義對象的時候使用List接口;
  2. 保存系統類信息的時候使用Set接口(避免重複)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章