一个不包含重复元素的 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); }特点:
有序,不可重复自然排序(字母表的顺序)自定义排序比较器用来排序两个参数,根据第一个参数小于等于或大于第二个参数分别返回负整数,零或正整数
使用方法: 定义实现类:
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); }