Set接口

    技术2024-05-15  60

    Set接口

    1.说明

    一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和e2 ,并且最多包含一个 null 元素。 特点:

    无序不可重复 主要子类: HashSetLinkedHashSetTreeSet

    不可重复的判定规则: 是先计算hashcode,hashcode相同时再计算equals方法。所以一般会同时重写这两个方法,hashCode重写是为了将想要判断变量加入到判断,不想判断的可以不写入,equals方法也是。

    原码中hashCode的算法: 通常在传入的是一个类的时候需要在类中重写equals和hashCode方法,为打印显示方便也会重写类的toString方法

    @Override public int hashCode() { return Objects.hash(name, age); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return age == student.age && Objects.equals(name, student.name); }

    2.HahSet

    3.LinkedHashSet

    是HashSet的子类说明是一种特殊的HashSet 【有序(添加顺序)、不可重复】可以通过增强for循环遍历,也可以通过迭代器进行循环Iterator iterator = set.iterator();

    4.TreeSet

    使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的Comparator 进行排序,具体取决于使用的构造方法。

    特点:

    有序,不可重复自然排序(字母表的顺序)自定义排序

    4.1自定义比较器

    比较器用来排序两个参数,根据第一个参数小于等于或大于第二个参数分别返回负整数,零或正整数

    使用方法: 定义实现类:

    public class MyComparator implements Comparator<Integer> { @Override public int compare(Integer o1, Integer o2) { return o2-o1; } } TreeSet<Integer> treeSet = new TreeSet<>(new MyComparator());

    实际案例:

    public static void main(String[] args) { List<Integer> integers = Arrays.asList(20, 18, 23, 22, 17, 24, 19, 18,24);//数组转 集合。 // TreeSet<Integer> treeSet = new TreeSet<>(integers);这个是默认的排序方式 //如果想从大到小排序,怎么办? 相当于自定义的比较规则。 //使用创建时提供比较器的构造方法 //由于我们实际开发中,这个比较器只使用一次。没有必要定义一个类出来。 // 所以更多的是是用匿名内部类 TreeSet<Integer> treeSet = new TreeSet<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2-o1; } }); treeSet.addAll(integers); System.out.println(treeSet); }
    Processed: 0.018, SQL: 9