Set集合

在 Java 集合框架中,Set 是一种不允许重复元素且不保证顺序(部分实现类会维护顺序)的集合。以下是其核心特点及常见实现类的详细说明:


Set 集合的核心特点

  1. 唯一性

    • 集合中不允许存在重复元素(通过 equals() 和 hashCode() 方法判断重复性)。

    • 添加重复元素时,操作会被忽略(返回 false)。

  2. 无序性

    • 默认不保证元素的存储顺序(如 HashSet)。

    • 部分实现类支持有序性(如 TreeSet 按自然排序,LinkedHashSet 按插入顺序)。

  3. 允许 null 值

    • 大多数实现类允许一个 null 元素(但 TreeSet 不允许,因为依赖排序规则)。

  4. 非线程安全

    • 常见实现类(如 HashSetTreeSet)非线程安全,需自行同步或使用并发集合。


Set 的实现类及特性

1. HashSet
  • 底层数据结构:基于 哈希表HashMap 实现),通过哈希值快速定位元素。

  • 特点

    • 无序(不保证插入或访问顺序)。

    • 允许 null 值。

    • 查询效率高O(1) 时间复杂度),但迭代顺序不可预测。

  • 适用场景:快速去重、无需顺序控制的场景。

    Set<String> set = new HashSet<>();
    set.add("Apple");
    set.add("Banana");
    set.add(null);  // 允许 null
2. LinkedHashSet
  • 底层数据结构:基于 哈希表 + 双向链表,继承自 HashSet

  • 特点

    • 维护元素的 插入顺序(迭代顺序与插入顺序一致)。

    • 允许 null 值。

    • 查询效率略低于 HashSet(因需维护链表)。

  • 适用场景:需要去重且保留插入顺序的场景(如缓存记录顺序)。

    Set<String> set = new LinkedHashSet<>();
    set.add("Apple");
    set.add("Banana");
    set.add("Apple");  // 重复元素被忽略
    // 迭代顺序:Apple → Banana
3. TreeSet
  • 底层数据结构:基于 红黑树TreeMap 实现),自动排序。

  • 特点

    • 元素按 自然顺序 或 自定义比较器Comparator)排序。

    • 不允许 null 值(排序依赖 compareTo() 或 Comparator)。

    • 增删查操作时间复杂度为 O(log n)

  • 适用场景:需要元素有序且去重的场景。

    Set<Integer> set = new TreeSet<>();
    set.add(5);
    set.add(2);
    set.add(8);
    // 自动排序结果:2 → 5 → 8
4. CopyOnWriteArraySet(并发安全)
  • 底层数据结构:基于 动态数组 + 写时复制(Copy-On-Write)机制。

  • 特点

    • 线程安全,适用于读多写少的场景。

    • 每次修改操作(增、删)会复制底层数组,性能较低。

    • 迭代器遍历的是创建时的快照,不会抛出 ConcurrentModificationException

  • 适用场景:高并发环境下的读操作远多于写操作的集合。


性能对比

实现类底层结构顺序性允许 null时间复杂度(增删查)线程安全
HashSet哈希表无序✔️O(1)
LinkedHashSet哈希表+链表插入顺序✔️O(1)
TreeSet红黑树自然/自定义O(log n)
CopyOnWriteArraySet数组插入顺序✔️O(n)(写操作)✔️

选择建议

  1. 快速去重且无需顺序 → HashSet

  2. 保留插入顺序的去重 → LinkedHashSet

  3. 需要元素排序 → TreeSet

  4. 高并发读操作 → CopyOnWriteArraySet(谨慎用于写多场景)。


注意事项

  • 所有 Set 实现类依赖元素的 equals() 和 hashCode() 方法判断重复性,需正确重写这两个方法。

  • TreeSet 若未指定 Comparator,元素必须实现 Comparable 接口,否则抛出 ClassCastException

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值