Set接口
1.说明
一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和e2 ,并且最多包含一个 null 元素。
特点:
- 无序
- 不可重复
主要子类:- HashSet
- LinkedHashSet
- TreeSet
不可重复的判定规则:
是先计算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);
}