老生常谈…对于大佬们根本都不用看的博客!
对于像我这种菜鸡还是得一步一步的来!如果有错误请大佬们指点指点!
Set集合
概念
- 不允许包含相同的元素,判断两个对象是否相同是根据 equals 方法;
- 存储顺序是无序的;
Set集合的子孙
- HashSet的底层是哈希表;
- LinkedHashSet的底层是哈希表;
- TreeSet的底层使用红黑树结构存储数据
HashSet
HashSet的概况
- 具有很好的存储、查找、删除性能;
- 底层实现原理是哈希表;
- 不能保证元素的顺序(存储顺序和取出顺序不一定相同);
- 不允许集合元素重复
- HashSet 不是线程安全的;
- 集合元素可以为 null;
LinkedHashSet
LinkedHashSet的概况
- 是 HashSet 的子类;
- 插入性能略低于 HashSet;
- 不允许集合元素重复;
- 使用双向链表来保证取出的顺序(实际上还是无序的) ;
TreeSet
TreeSet的概况
- SortedSet 接口的实现类可以保证元素处于排序的状态;
- 底层使用红黑树结构,内部使用TreeMap实现;
- 两种排序方法:自然排序和定制排序。默认情况:自然排序;
自然排序
- 默认将集合按升序排序
- 会调用集合元素的compareTo(Object obj)的方法比较
- 如果将对象加入到TreeSet中需要实现Comparable接口
public class User implements Comparable<User> {
//alt+insert 实现get、set、构造方法等 或 Lombok注解
@Override
public int compareTo(User o) {
return Integer.compare(this.age,o.age);
}
}
定制排序
传统写法:
Set<User> set = new TreeSet<>(new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
return Integer.compare(o2.getAge(), o1.getAge());
}
});
lambda写法:
Set<User> set = new TreeSet<>((o1, o2) -> Integer.compare(o2.getAge(), o1.getAge()));