Java基础-23、Set如何判断元素重复

HashSet区分重复元素:
先使用hashcode方法判断已经存在HashSet中元素的hashcode值和将要加入元素hashcode值是否相同。如果不同,直接添加;如果相同,再调用equals方法判断,如果返回true表示HashSet中已经添加该对象了,不需要再次添加(重复),如果返回false就表示不重复,可以直接加入HashSet中
TreeSet区分重复元素:
TreeSet中的元素对象如果实现Comparable接口,使用compareTo方法区分元素是否重复,如果没实现Comparable接口,自定义比较器(该类实现Comparator接口,覆盖compare方法)比较该元素对象,调用TreeSet的构造方法new TreeSet(自定义比较器参数),这样就可以比较元素对象了

首先要清楚Object中的hashCode 与equals 方法

hashCode返回的是int型,为对象的内存地址
equals比较的是两个引用是否指向同一地址

自定义的类如果重写Object中的hashcode和equals就可以自定义设置set如何判断元素重复。
重写时要注意:
1、返回值和参数一定要一样,因为Object.equals中参数是Object类型,所以重写时参数类型也必须是Object类型
2、函数名注意大小写,第一个单词小写,其余单词首字母大写。
示例:自定义类型A,只要私有遍量a相等,set就会判断为重复

public class text{
    public static void main(String[] args){
        Set<A> set1=new HashSet<>();
        A a1=new A(1);
        A a2=new A(1);
        set1.add(a1);
        set1.add(a2);
        System.out.println(set1.size());//打印1
    }
}
class A
{
    int a;
    public A(int a)
    {
        this.a=a;
    }
    //@Override
    public int hashCode()
    {
        return a;
    }
    //@Override
    public boolean equals(Object o)
    {
        if(!(o instanceof A))
        {
            return false;//不是同类型,不相同
        }
        if(this==o)
        {
            return true;//o也指向本对象,相等
        }
        if(this.a==((A)o).a)
        {
            return true;//自定义的“相同”
        }
        else
        {
            return false;
        }
    }
}

扩展:

1、String里也重写了hashCode,对象里的字符相同计算出来的hashcode就相同,即string里的hashCode并不是地址
2、因此往set里添加字符串时,只要字面量相同时就会被判断为重复元素。

你可能感兴趣的:(Java基础)