"/>
侧边栏壁纸
博主头像
PySuper 博主等级

千里之行,始于足下

  • 累计撰写 286 篇文章
  • 累计创建 17 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

Java Set

PySuper
2022-11-05 / 0 评论 / 0 点赞 / 10 阅读 / 0 字
温馨提示:
所有牛逼的人都有一段苦逼的岁月。 但是你只要像SB一样去坚持,终将牛逼!!! ✊✊✊

特点

Set 集合有什么特点?如何实现 key 无重复的?

  1. Set 集合核心特点

    • 无序性:不保证存储顺序(如 HashSet),部分实现(如 LinkedHashSet)通过链表维护插入顺序

    • 唯一性:元素必须唯一,重复元素自动过滤

    • 允许 null 值:多数实现(如 HashSet)允许一个 null,ConcurrentHashSet 等线程安全实现禁止 null

    • 动态扩容:无固定大小限制,底层通过哈希表或平衡树管理容量

  2. 实现 key 无重复的机制

    • 哈希表与 hashCode()

      • 添加元素时计算 hashCode(),哈希函数定位存储位置

      • 哈希位置为空则存储;冲突时触发链表/红黑树处理

    • equals() 精确判重

      • 哈希冲突时调用 equals() 判断元素是否相同,相同则拒绝添加

      • 自定义类需重写 hashCode()equals(),否则基于内存地址判重

  3. 不同实现类特性对比

    • HashSet:基于哈希表,查询 O(1),无序,允许 null

    • LinkedHashSet:维护插入顺序链表,适合需保留顺序的场景

    • TreeSet:基于红黑树,元素按自然顺序或比较器排序,查询 O(log n)

    • ConcurrentHashSet:线程安全(如包装 ConcurrentHashMap),禁止 null

  4. 应用场景

    • 去重操作:快速过滤重复元素(如日志去重)

    • 集合运算:高效计算交集、并集、差集(如权限比对)

    • 缓存唯一数据:存储唯一标识符或配置项(如用户 ID 缓存)

有序

有序的 Set 是什么?记录插入顺序的集合是什么?

  1. 有序的 Set 实现

    • LinkedHashSet

      • 基于哈希表 + 双向链表,维护元素插入顺序

      • 迭代顺序与添加顺序一致,适合需要保留插入顺序的去重场景(如操作日志记录)

    • TreeSet

      • 基于红黑树,元素按自然顺序(如数值大小)或自定义比较器排序

      • 适合需要排序查询的场景(如排行榜)

  2. 记录插入顺序的集合

    • LinkedHashSet:唯一支持记录插入顺序的 Set,通过链表维护顺序,哈希表保证唯一性

    • 对比其他结构

      • List(如 ArrayList):记录顺序但允许重复,不属于 Set

      • LinkedHashMap:记录键的插入顺序,但存储键值对而非单一元素

  3. 选择建议

    • 保留插入顺序:使用 LinkedHashSet(如按步骤记录唯一事件)

    • 自定义排序:使用 TreeSet(如按价格排序商品)

    • 性能考量

      • LinkedHashSet:查询/插入 O(1),内存开销略高于 HashSet

      • TreeSet:增删查 O(log n),适合大数据量排序场景

Java 实现 LRU


0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区