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种比较方法,其排序方式应该为二叉树排序(未看代码,但估计是)。

猜你喜欢

转载自blog.csdn.net/qq_27368993/article/details/82668388
今日推荐