1. 程式人生 > >Thinking in java自讀筆記:HashSet與TreeSet

Thinking in java自讀筆記:HashSet與TreeSet

Set集合不能存入相同的元素,HashSet是根據equals()與hashCode()方法來判定元素是否相同,TreeSet是根據compareTo()方法來判定元素是否相同,也可以根據compare()方法來判定,因為compareTo()和compare()方法並不定義於根類,因此要使用TreeSet必須實現compareTo()方法或者compare方法。TreeSet可以得到一個順序列表,HashSet不能保證列表順序。

一.HashSet
HashSet是在equals()方法判定為真時,且hashCode()方法返回值相等,則認為元素相同,其實現原理是通過雜湊表來實現的。預設的hashCode()方法是根據物件地址映射出來的一個值,使用這個值經過雜湊演算法得到一個雜湊碼,即使2個不同物件的雜湊碼也有可能相同,因此需要equals()方法來進一步保證元素的相同性。

import java.util.*;

public class Test {
    public static void main(String[] args) {
        HashSet<Student> hs=new HashSet<Student>();
        Student s1=new Student("LX");
        Student s2=new Student("LX");
        hs.add(s1);
        hs.add(s2);
        System.out.println(hs.size());
    }
}
class Student{
    String name;

    public
Student(String name) { this.name = name; } @Override public boolean equals(Object obj) { if (obj instanceof Student) { return ((Student) obj).name == name; } return false; } @Override public int hashCode() { return 1; } }

輸出為:1

二.TreeSet
TreeSet是根據compareTo()方法或compare()方法來判定2個元素是否相同的,其實現原理是通過二叉樹實現的,通過定製排序或者自然排序來比較元素大小,與其說是排序,不如說是比較元素的方法。
方式一:*自然排序,重寫compareTo()方法*

import java.util.*;

public class Test {
    public static void main(String[] args) {
        TreeSet<Student> ts=new TreeSet<Student>();
        Student s1=new Student("LX");
        Student s2=new Student("LX");
        ts.add(s1);
        ts.add(s2);
        System.out.println(ts.size());
    }
}
class Student implements Comparable {
    String name;

    public Student()
    {}
    public Student(String name) {
        this.name = name;
    }

    @Override
    public int compareTo(Object o) {
        if(o instanceof Student)
        {
            if(name.compareTo(((Student) o).name)==0)
                return 0;
            if(name.compareTo(((Student) o).name)>0)
            {
                return 1;
            }
        }
        return -1;
    }
}

方式二:定製排序,重寫compare方法,在定義TreeSet時傳入一個重寫了compare()方法的物件

import java.util.*;

public class Test {
    public static void main(String[] args) {
        TreeSet<Student> ts=new TreeSet<Student>(new Student());
        Student s1=new Student("LX");
        Student s2=new Student("LX");
        ts.add(s1);
        ts.add(s2);
        System.out.println(ts.size());
    }
}
class Student implements Comparator {
    String name;

    public Student()
    {}
    public Student(String name) {
        this.name = name;
    }

    @Override
    public int compare(Object o1, Object o2) {
        Class it=o1.getClass();
        if(it==o2.getClass()&&it.getName()=="Student")
        {
            int num=((Student)o1).name.compareTo(((Student)o2).name);
            if(num==0)return 0;
            if(num>0)return 1;
        }
        return -1;
    }
}

輸出為:1

總結:
1.HashSet是通過雜湊表來實現的,通過equals()方法和hashCode()方法來判斷元素是否相等。
2.TreeSet是通過二叉樹實現的,有2種比較方法,其排序方式應該為二叉樹排序(未看程式碼,但估計是)。