hashSet与treeSet的去重原理

hashSet与treeSet的去重原理

Set:无序的,不可重复的,线程不安全的

1,treeSet去重原理:compareTo

可以实现排序及去重:如果compareTo返回0,说明是重复的,返回的是自己的某个属性和另一个对象的某个属性的差值,如果是负数,则往前面排,如果是正数,往后面排;
应用:类实现compareable接口,覆写其compareto方法,根据自己的需要改变其排序及去重规则,比如职员类,根据其工资水平进行去重和排序 。

2,hashSet去重原理:1,hashCode 2,equals是否相同

两个方法可以快速生成,hashCode是几个属性的hashCode共同计算的结果 (基本数据类型的实现类生成的hashCode是其拆箱后的值的比较,跟引用数据类型的规则不同,如Integer类)
应用:可以通过覆写hashCode和equals方法改变其去重规则,进行自定义去重;

set集合针对String 类型和8大基础数据类型 过滤掉重复数据

如果存放的是其他类型对象,则需要重写hashCode方法和equals方法,
当hashcode相等时(先执行hashCode方法),则会去执行equals方法,比较每个属性的值 ,如果一致的话,则不会存进set,否则加入set集合。

Set之所以会去重,和map有很大的关系

看源码你会发现
HashSet底层使用HashMap存储
TreeSet底层使用TreeMap存储
LinkedHashSet底层使用LinkedHashMap存储
HashSet为例子,我们查看add()方法的源码

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

return的map对象其实是 一个HashMap

private transient HashMap map;

再看map.put(e, PRESENT) 被传进来的泛型对象当成了Map的键,因为Map键值重复的话新的键会覆盖旧的键值,所以Set不会重复。

你可能感兴趣的:(java重要知识点,java基础知识点)