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里添加字符串时,只要字面量相同时就会被判断为重复元素。