*阿炮的Java笔记007号*-会持续更新的Set笔记

85 阅读1分钟

老生常谈…对于大佬们根本都不用看的博客!

对于像我这种菜鸡还是得一步一步的来!如果有错误请大佬们指点指点!

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()));