HashSet、TreeSet去重排序机制

1,549 阅读2分钟

HashSet去重 (判断重复机制)

HashSet:无序不可重复的集合,线程不安全的,底层基于HashMap,基于hashCode();

判断重复的机制:

  1. 先判断当前元素和要添加的元素hashCode()是否相等
  2. 若hashCode()相等,再判断当前元素和要添加元素equals()是否相等,若相等,则认为两元素相同

TreeSet去重排序机制

TreeSet:无序不可重复的集合,线程不安全的,底层基于红黑树(一种特殊二叉树,有自平衡机制,左叉小,右叉大)

判断重复和排序机制:

自然排序

目标元素类实现Comparable接口,重写compareTo()方法

  • 正数: 表示不同元素,升序
  • 负数: 表示不同元素,降序
  • 0: 表示相同的元素

代码示例:

定义User类自然排序,根据年龄升序,名称长度降序

public class User implements Comparable<User>{
    private String name;
    private int age;

    //get,set,构造方法,toString...

    @Override
    public int compareTo(User o) {
        if(this.age >o.age){
            //升序
            return 1;
        }else if(this.age <o.age){
            return -1;
        }else {
            if(this.name.length()>o.name.length()){
                //降序
                return -1;
            }else if(this.name.length()<o.name.length()){
                return 1;
            }else {
                return 0;
            }
        }
    }
}

测试:

public class Demo {
    public static void main(String[] args) {
        TreeSet<Object> treeSet = new TreeSet();
        treeSet.add(new User("张三",17));
        treeSet.add(new User("李思思",17));
        treeSet.add(new User("李思思是是是",18));
        treeSet.add(new User("李思思说",18));
        System.out.println(treeSet);
    }
}

结果:

image.png


定制排序

在创建TreeSet对象的时候,将一个比较器Comparator子类对象传入,重写compare()方法

  • 正数: 表示不同元素,升序
  • 负数: 表示不同元素,降序
  • 0: 表示相同的元素

注意: 定制排序优先级高于自然排序

代码示例:

定义User类的比较器UserComparetor,根据年龄降序,名称长度升序

public class UserComparetor implements Comparator<User> {

    @Override
    public int compare(User o1, User o2) {
        if(o1.getAge() >o2.getAge()){
            return -1;
        }else if(o1.getAge() <o2.getAge()){
            return 1;
        }else {
            if(o1.getName().length()>o2.getName().length()){
                return 1;
            }else if(o1.getName().length()<o2.getName().length()){
                return -1;
            }else {
                return 0;
            }
        }
    }
}

测试:

public class Demo {
    public static void main(String[] args) {
        TreeSet<Object> treeSet = new TreeSet(new UserComparetor());
        treeSet.add(new User("张三",17));
        treeSet.add(new User("李思思",17));
        treeSet.add(new User("李思思是是是",18));
        treeSet.add(new User("李思思说",18));
        System.out.println(treeSet);
    }
}

结果:可以看出自然排序和定制排序同时存在时,定制排序优先级高

image.png