首页 > 其他分享 >分析 HashSet 和 TreeSet 分别如何实现去重的

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

时间:2024-08-27 20:15:47浏览次数:9  
标签:分析 Comparator HashSet age 比较 Student public TreeSet

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

 

(1)HashSet 的去重机制:hashCode() + equals()。底层先通过存入对象,进行运算得到一个 hash 值,通过 hash 值得到对应的索引,如果发现 table 索引所在的位置,没有数据,就直接存放;如果有数据,就进行 equals 遍历比较,比较后不相同,就加入,否则,不加入。

(2)HashMap 的去重机制:如果传入了一个 Comparator 匿名对象,就使用实现的 compare 去重。如果方法返回0,就认为是相同的元素,不添加键,把对应的值覆盖;如果没有传入 Comparator 匿名对象,则以所添加的对象实现的 Compareable 接口的 CompareTo 去重。

 


 

附1:三种方法的对比

 

① equals

这个方法只能用作对象之间的比较,比较是否相等(=/ !=),而不能比较出谁大谁小(>,<,=)。

如果没有重写equals方法,那会自动调用object类的equals方法,即比较地址。

②  基于 Comparble 接口类的比较

写在类的里面,参数是所要比较的类。比较本类和所传入的类。

对用用户自定义类型,如果要想按照大小与方式进行比较时:在定义类时,实现Comparble接口即可,然后在类中重写 compareTo 方法。这种方式可以实现存在排序的大小比较,但是只能根据一个比较准则来进行比较。

class Student implements Comparable<Student> {
    public int age;
    public String name;
    @Override
    public int compareTo(Student o) {  // 写在类的里面,比较的是本类和传入的类
        return this.age - o.age;
    }
}

③ 基于 Comparator 接口类的比较

写在类的外部,参数是两个比较的对象。

重写 Comparetor 里的 compare 方法即可。可以每个准则对应生成一个类、实现 Comparator 接口,然后重写 compare 方法。

class Student {
    public int age;
    public String name;
    }
// 写在类的外部,参数是两个比较的对象
//年龄比较器
class AgeComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.age - o2.age;
    }
}
//姓名比较器
class NameComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.name.compareTo(o2.name);//直接调用引用类型String的比较方法
    }
}

 


 

 

附2:代码分析题:下面代码运行是否抛出异常,从源码层面说明原因。

TreeSet treeSet = new TreeSet();
treeSet.add(new Person());

class Person{}

分析:add 方法,因为 TreeSet() 构造器没有传入 Comparator 接口的匿名内部类,所以在底层会实现 Comparable<? super K> k = (Comparable<? super K>) key; 即把 Person 类转成  Compareable 类型,而 Person 类并未实现该接口。因此 add 语句会报错:ClassCastException。

标签:分析,Comparator,HashSet,age,比较,Student,public,TreeSet
From: https://www.cnblogs.com/97gogo/p/18383205

相关文章

  • 【数字时序】SI(信号完整性分析)/Cross talk(串扰)/Delta delay/噪声/消除delay和噪声
    之前分享的那一篇感觉理论太多了这一篇感觉更好,数字后端的带概念带数据还带经验指导,转过来收藏一哈。目录一、Crosstalk1.CrosstalkDelayEffects​编辑2.CrosstalkNoiseEffects​编辑二、CrosstalkAnalysis​编辑1.CrosstalkDelayAnalysis2.CrosstalkNois......
  • 《骑马与砍杀:火与剑》 缺失 DLL 文件的修复教程——从原因分析到解决步骤的详细指南
    《骑马与砍杀:火与剑》是一款备受欢迎的角色扮演游戏,但有时玩家会遇到游戏缺失必要的动态链接库(DLL)文件的情况,如d3dx9-42.dll。这种情况可能导致游戏无法启动或运行时出现错误。本文将详细介绍导致此类问题的原因以及相应的解决方法。缺失DLL文件的原因游戏安装不完整:可能......
  • Java语言-SpringCloud架构-EMS能源管理系统(水-电-气-热-油等数据采集分析系统)
    Java语言-SpringCloud架构-EMS能源管理系统(水-电-气-热-油等数据采集分析系统)介绍适用于高能耗企业、建筑、工厂、园区的水、电、气、热、油、空压机等能源数据采集、分析、报表;基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud......
  • 流媒体协议分析
    m3u8、RTSP、RTMP和WebRTC等等都是用于视频流传输的协议或格式,它们各自有特定的用途和特点:m3u8:格式:.m3u8是一种媒体播放列表格式,通常用于直播流和点播视频流。M3U8文件通常与HLS(HTTPLiveStreaming)一起使用。用途:.m3u8文件定义了一个播放列表,包含了视频流的位置......
  • 深度解析:视频监控系统部署前的技术选型与需求分析
    视频监控系统在日常生活与企业运营中扮演着至关重要的角色,广泛应用于办公室、工地、写字楼、库房及工厂等场所。为确保系统部署的精准与高效,以下是在选型评估前必须掌握的几项关键信息:一、摄像头布局与数量数量规划:基于监控区域的具体需求,结合建筑物图纸或现场勘查,初步确定摄像......
  • 【表面肌电信号SEMG】带通滤波时域和频域特征分析【含Matlab源码 7348期】
    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信或扫描文章底部QQ二维码。......
  • 基于python的保险业务数据可视化分析系统【python-爬虫-大数据定制】
    精彩专栏推荐订阅:在下方专栏......
  • [焊接]Abaqus超声波焊接分析
    文章主要介绍了超声波焊接技术在汽车、电子等行业的应用,特别是近几年电池Pack的电芯中。超声波焊接利用高频振动波传递到两个需焊接的物体表面,在加压的情况下,使两个物体表面相互摩擦而形成分子层之间的熔合。Abaqus超声焊接模型中,金属薄片之间为接触摩擦,系数为0.3,治具含金属箔......
  • 使用ChatGPT完成数据分析与可视化的全过程
    学境思源,一键生成论文初稿:AcademicIdeas-学境思源AI论文写作在数据驱动的时代,数据分析与可视化成为了洞察信息、支持决策的重要工具。ChatGPT可以显著提升这些任务的效率和准确性。本文将探讨如何运用ChatGPT来简化数据分析和可视化的过程,包括从数据清理、缺失值处理到生......
  • 数据库系统 第26节 数据库调优 案例分析
    数据库调优通常不需要修改源代码,因为它主要涉及数据库配置、查询优化和硬件调整等方面。然而,源代码中的某些实践可以显著影响数据库性能。以下是一些常见的源代码实践,这些实践可以与数据库调优相结合:参数化查询:避免SQL注入并提高查询效率,使用参数化查询代替字符串拼接查......