1、TreeSet去重原理 :compareTo
可以实现排序及去重:如果compareTo返回0,说明是重复的,返回的是自己的某个属性和另一个对象的某个属性的差值,如果是负数,则往前面排,如果是正数,往后面排;
应用:放入TreeSet中的对象,类必须实现compareable接口,覆写其compareto方法,根据自己的需要改变其排序及去重规则,比如职员类,根据其工资水平进行去重和排序 。
eg:
public class TestUser implements Comparable<TestUser>{
...
@Override
public int compareTo(TestUser testUser) {
...
return ...;
}
}
TreeSet<TestUser> sets = new TreeSet<>();
//必须实现Comparable接口,否则会报错
sets.add(new TestUser());
2、hashSet去重原理:1,hashCode 2,equals是否相同
我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降低了使用equals()方法的次数
当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象 ◾如果没有哈希值相同的对象就直接存入集合,如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存
将自定义类的对象存入HashSet去重复 ◦类中必须重写hashCode()和equals()方法
hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)
equals(): 属性相同返回true, 属性不同返回false,返回false的时候存储。