当前位置: 首页 > news >正文

HashSet 和 TreeSet 分别是如何实现去重的

      • HashSet 的去重
      • TreeSet 的去重
      • HashSet 和 TreeSet 的去重原理对比

HashSet 的去重

HashSet 依赖 HashMap 来实现去重。HashSet 是基于哈希表的数据结构,因此它使用对象的哈希值来判断元素的唯一性。

  1. 底层结构

    • HashSet 的底层是使用一个 HashMap 实现的。HashSet 实际上将元素存储在一个 HashMap 的键(key)上,而所有的值(value)都是一个固定的常量对象 PRESENT
    • 因此,HashSet 中的每一个元素相当于 HashMap 中的一对 key-value 对,其中 key 是我们存储的对象,value 是一个单一的对象(通常是 PRESENT)。
  2. hashCode 和 equals 方法

    • 当向 HashSet 中添加一个新元素时,首先会调用该对象的 hashCode() 方法,计算出哈希码,用于判断它在哈希表中的位置。
    • 这意味着如果两个对象的 hashCode() 值不同,它们一定被认为是不同的对象,直接添加。
    • 如果哈希码相同,那么可能发生哈希冲突HashSet 会进一步调用 equals() 方法来判断这两个对象是否真的相等。
      • 如果 equals() 方法返回 true,表示这两个对象相等,新对象不会被添加。
      • 如果 equals() 方法返回 false,即便它们的哈希码相同(哈希冲突),新对象仍然会被添加。
  3. 结论

    • 总的来说,HashSet 是通过哈希码(hashCode() 方法)来快速确定元素位置,并通过 equals() 方法来确保元素不重复。哈希码用于初步筛选equals() 用于精确比较
    • 因此,HashSet 的性能相对较高,尤其是在查找和插入时,因为哈希表的查找复杂度是接近 O(1) 的。

TreeSet 的去重

TreeSet 是基于红黑树的数据结构,它依赖自然排序或者比较器来确保元素不重复,并保持元素的有序性。

  1. 底层结构

    • TreeSet 的底层是基于 TreeMap 实现的,具体来说是一个红黑树
    • 红黑树是一种自平衡的二叉搜索树,可以确保每次添加元素时树的高度保持平衡,从而保证较好的性能。TreeSet 中的元素是按一定顺序排序的。
  2. 元素比较

    • TreeSet 的去重依赖于元素之间的比较,而不是哈希值。在添加元素时,TreeSet 需要使用比较逻辑来判断新元素是否与树中的某个元素相同。
    • 如果元素实现了 Comparable 接口(例如 StringInteger),那么 TreeSet 会调用元素的 compareTo() 方法来比较两个元素的大小。
      • 如果 compareTo() 返回 0,表示这两个元素是相等的,新元素不会被添加。
      • 如果返回负数或正数,则表示元素的相对顺序,TreeSet 会按照这个顺序将新元素插入到正确的位置。
    • 如果元素没有实现 Comparable,用户可以自定义一个 Comparator,并将其传递给 TreeSet 的构造方法。TreeSet 会使用这个比较器来判断元素的相等性。
    • 因此,在 TreeSet 中,两个对象是通过 compareTo() 或者 Comparatorcompare() 方法返回值来判断是否相等的。
  3. 结论

    • TreeSet 的去重是基于比较逻辑实现的,它通过比较器或者对象的自然排序来判断元素的唯一性。
    • TreeSet 中的查找、插入和删除操作的复杂度是 O(log n),因为它使用的是红黑树结构。

HashSet 和 TreeSet 的去重原理对比

集合类型去重机制底层实现比较依据时间复杂度(插入/查找)
HashSethashCodeequals 方法哈希表(HashMap哈希值和相等判断平均 O(1)
TreeSet比较器或 Comparable红黑树(TreeMap自然排序或 ComparatorO(log n)
  • HashSet 适合需要快速查找的场景,但它无法保证元素的顺序。
  • TreeSet 适合需要有序存储的场景,它的插入和查找性能略低于 HashSet

如果需要保持有序性(例如按字母顺序或数值大小),则使用 TreeSet

如果不关心元素的顺序且更关注性能,使用 HashSet 更合适。


http://www.mrgr.cn/news/63326.html

相关文章:

  • Java 基于微信小程序的高校科研团队管理系统设计与实现(附源码,部署,文档
  • RPC实现原理,怎么跟调用本地一样
  • 2025华数杯国际赛A题完整论文讲解(含每一问python代码+数据+可视化图)
  • 【RedisStack】Linux安装指南
  • 新车月交付突破2万辆!小鹏汽车“激活”智驾之困待解
  • 【算法】判断一个链表是否为回文结构
  • Java 批量导出Word模板生成ZIP文件到浏览器默认下载位置
  • 【经验分享】从网页下载内嵌PDF的小妙招,亲测好用
  • OpenEuler 使用ffmpeg x11grab捕获屏幕流,rtsp推流,并用vlc播放
  • React04 State变量 组件渲染
  • fasdsdsadsa
  • 2024高性价比电容笔推荐!盘点实测西圣、绿联、酷盟电容笔!
  • qt QStackedWidget详解
  • Gemini API 和 Google AI Studio 升级,提升搜索准确性和响应能力
  • L 波段射频信号采集回放系统
  • window与Linux基础-1
  • Jenkins You‘re using ‘Known hosts file‘,known_hosts file does not exist
  • QList
  • 图片批量处理神器将每个文件夹中的多张图片拼接,一键实现横向和纵向的长图拼接效果,让你的图片处理更高效
  • 漓江景区景点推荐
  • LLMs在股票投资组合崩溃中的时间关系推理
  • 当贝F6和当贝F7Pro区别对比:新品当贝F7Pro性能配置全面升级
  • 39. 组合总和
  • SpringBoot3集成Swagger接口文档功能、接口排序以及如何设置接口页面的title/keyword/description?
  • BeanFactory与ApplicationContext的关系
  • CVPR2024:完全测试时域适应​​​​(Test-time Adaptation)的目标检测