Set:不可重复,无序(可排序)
Map集合与Set集合的区别是储存的是键值对,其他一样
1.TreeSet
TreeSet:底层是红黑树
自然排序:
存储的对象必须实现 Comparable 接口,重写 compareTo();
在 compareTo() 里指定排序规则
返回负数,代表在树的左边,正数代表在树的右边,0则不存储
compareTo() 中 this 要存储的对象,参数代表已存储的对象
需要针对存储的对象对应的类进行改变
比较器:
在实例化 TreeSet 集合的时候,通过构造方法传递 Comparator 接口的实现类
对象,并重写 Comparator 接口的 compare()方法
compare() 中第一个参数是即将存储的对象,第二个参数为集合中已存储的对象
不需要对存储的对象进行改变,但是创建集合的时候需要传递比较器
如果自然排序和比较器都使用,则使用比较器的规则,因为使用自然排序和比较器是根据
比较器是否为 null 进行判断
自然排序写法
public class User implements Comparable<User>{
private int id;
public User(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
//按id从大到小
//当前对象为要存储的对象,参数为已存储进集合的对象
@Override
public int compareTo(User o) {
return o.getId()-this.getId();
}
}
比较器写法
public class MyComparator implements Comparator<User> {
//第一个参数为要存储的对象
//第二个是已存储的对象
@Override
public int compare(User o1, Usero2) {
return o2.getId()-o1.getId();
}
}
使用比较器
Set<Teacher> set = new TreeSet(new MyComparator());
2.HashSet
HashSet:无序不可重复
底层是hash表+链表+红黑树
hash表中的元素个数超过容量的负载因子数则会发生数组扩容,容量为原来的2倍
链表的元素超过8位则会转换成红黑树
如果希望存储的对象内容相同则覆盖,需要重写hashCode()和equals()
运转流程:获取对象hash值,通过equals比对内容
public class Demo01 {
public static void main(String[] args) {
Set<Integer> set = new HashSet<>();
set.add(11);
set.add(55);
set.add(33);
set.add(55);
set.forEach(item -> {
System.out.println(item);
});
}
}