1. 程式人生 > 其它 >JAVA 集合三(Set、HashSet、TreeSet、LinkedHashSet)

JAVA 集合三(Set、HashSet、TreeSet、LinkedHashSet)

一、Set概述和特點

  概述:一個不包含重複元素的 collection。更確切地講,set 不包含滿足 e1.equals(e2) 的元素對 e1e2,並且最多包含一個 null 元素。正如其名稱所暗示的,此介面模仿了數學上的 set 抽象。

  特點:不包含重複的集合;沒有帶索引的方法,所以不能使用普通for迴圈遍歷

二、方法

 

 三、雜湊值

  概述:是JDK根據物件的地址或者字串或者數學算出來的int型別的數值

  獲取方式:Object類中的方法獲取物件的雜湊值 public int hashCode()

四、HasSet

  概述:此類實現一個雜湊表,該雜湊表將鍵對映到相應的值。任何非 null

物件都可以用作鍵或值。

  特點:底層資料結構是雜湊表

     對集合的迭代順序不做任何保證,也就是說不保證儲存和取出的元素順序一致

       沒有帶索引的方法,所以不能使用普通for迴圈遍歷

       由於Set集合,所以是不是包含重複元素的集合

五、HashSet集合保證元素唯一性原始碼分析

 

 @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student=(Student) o;
        return Age == student.Age && Objects.equals(Name, student.Name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(Name, Age);
    }

  

 六、LinkedHashSet集合

  概述:具有可預知迭代順序的 Set 介面的雜湊表和連結列表實現。此實現與 HashSet 的不同之外在於,後者維護著一個運行於所有條目的雙重連結列表。此連結列表定義了迭代順序,即按照將元素插入到 set 中的順序(插入順序)進行迭代。注意,插入順序 受在 set 中重新插入的 元素的影響。(如果在 s.contains(e) 返回 true 後立即呼叫 s.add(e),則元素 e 會被重新插入到 set s 中。) 

  特點:雜湊表和連結串列實現的Set介面,具有可預測的迭代次序

            由連結串列保證元素有序,也就是說元素的儲存和取出順序是一致的

    由雜湊表保證元素唯一,也就是說沒有重複的元素

Set set=new LinkedHashSet();

七、TreeSet集合

概述:基於 TreeMapNavigableSet 實現。使用元素的自然順序對元素進行排序,或者根據建立 set 時提供的 Comparator 進行排序,具體取決於使用的構造方法。 

特點:元素有序,這裡的順序不是指的儲存和取出的順序,而是按照一定的規則進行排序,具體排序方式取決於構造方法

    TreeSet():根據其元素的自然排序進行排序

    TreeSet(Comparator comparator):根據指定的比較器進行排序

           沒有帶索引的方法,所以不能使用普通的for迴圈遍歷

      由於是Set集合,所以不包含重複元素的集合

八、自然排序Comparable的使用

方式一:重新自然排序方法

public class Student implements Comparable {
    public Student() {
    }

    public Student(String name, int age) {
        this.Name=name;
        this.Age=age;
    }

    private String Name;
    private int Age;

    public String GetName() {
        return this.Name;
    }

    public void SetName(String name) {
        this.Name=name;
    }

    public void SetAge(int age) {
        this.Age=age;
    }

    public int GetAge() {
        return this.Age;
    }
//繼承介面:Comparable 重寫比較器
    @Override
    public int compareTo(Object o) {
        Student st=(Student) o;
        int num=this.GetAge()- st.GetAge();
        num=num==0?this.GetName().compareTo(st.GetName()):num;
        return num;
    }

//    @Override
//    public boolean equals(Object o) {
//        if (this == o) return true;
//        if (o == null || getClass() != o.getClass()) return false;
//        Student student=(Student) o;
//        return Age == student.Age && Objects.equals(Name, student.Name);
//    }
//
//    @Override
//    public int hashCode() {
//        return Objects.hash(Name, Age);
//    }
}

 方式二:初始化TreeSet用匿名函式寫比較器

   TreeSet<Student> ts=new TreeSet<Student>(new Comparator<Student>() {
    @Override
    public int compare(Student s1, Student s2) {
        int num=s1.GetAge()- s2.GetAge();
        num=num==0?s1.GetName().compareTo(s2.GetName()):num;
        return num;
    }
});