文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java中HashSet集合怎么对自定义对象进行去重

2023-06-16 17:54

关注

本篇内容介绍了“Java中HashSet集合怎么对自定义对象进行去重”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Java中Set接口是Collectio的子接口,Set集合不允许包含相同的元素。如果添加相同的元素, add()会返回FALSE,  新元素不会加入。Set集合常用于元素为数字、字符串去重等,但是当元素为自定义对象类型时,Set去重是否与我们预计一致?下面将以HashSet为例,通过一系列试验来一步步验证。

1. 先建立一个FootBallPlayer足球运动员类

Java中HashSet集合怎么对自定义对象进行去重

2. (假设:HashSet会把属性值全相同的对象认定为重复),为了测试HashSet对对象去重效果与猜想是否一致,我们先构建三个对象实例,其中构造两个属性一致的“C罗”。

Java中HashSet集合怎么对自定义对象进行去重

结果:HashSet并没有认定两个“C罗”对象重复,三个实例都加入到了HashSet集合中。

Java中HashSet集合怎么对自定义对象进行去重

3. 在了解HashSet如何进行去重之前,先看看HashSet是怎么实现的。通过查看JDK源码发现HashSet内部其实是对HashMap进行操作。

Java中HashSet集合怎么对自定义对象进行去重

4. 继续查看hashSet的add()方法,其实是调用了HashMap的put()方法

Java中HashSet集合怎么对自定义对象进行去重

5. 继续追踪,直到putVal()方法(重点)

Java中HashSet集合怎么对自定义对象进行去重

Java中HashSet集合怎么对自定义对象进行去重

仔细看putVal()方法,发现其对于新入的元素是否重复判断依据为以下两种

6. 了解了两个判断条件后,我们先做一个简单实验,既调用Integer 、String 、Object等对象equals()方法进行对比

Java中HashSet集合怎么对自定义对象进行去重

结果发现,自定义Object对象equals返回的值为false。接下来我们逐一看看它们的equals实现方式

Java中HashSet集合怎么对自定义对象进行去重

(1) Integer对象的equals实现,通过阅读代码发现是判断依据是值是否相等。

Java中HashSet集合怎么对自定义对象进行去重

(2) String对象的equals实现,其判断的依据为:先判断引用的对象是否是同一个,再逐个对比其字符串的值

Java中HashSet集合怎么对自定义对象进行去重

(3)  而Object的判断依据为引用的对象是否是同一个,由于上面的两位足球运动员都是新new出来的,非同一个对象,所以equlas()返回结果为false

Java中HashSet集合怎么对自定义对象进行去重

7. 看完了equlas的实现,接下来看看Integer String  Object的hashCode实现。同样先做一个简单的测试,调用它们的hashCode()方法计算出hash值进行对比

Java中HashSet集合怎么对自定义对象进行去重

实验为结果两个Object对象的hash值并不相等,接下来我们看看它们对于hashcode()的具体实现

Java中HashSet集合怎么对自定义对象进行去重

(1) 通过源码发现 Integer是通过对其value值来进运算行得到hash值。

Java中HashSet集合怎么对自定义对象进行去重

(2) String也是通过对其value值来进计算行得到hash值,所以测试中结果为true

Java中HashSet集合怎么对自定义对象进行去重

(3) 当查看Object的hashCode()方法时发现并无具体实现,通过查阅资料得知,JDK8的默认hashCode的计算是交给C++实现的,方法是通过和当前线程有关的一个随机数+三个确定值,运用Marsaglia's

xorshifschema随机数算法得到的一个随机数。所以两个不同的对象得到的hash值便不相同,测试结果也为false。(对于Object的hashCode()这里不做深入讨论,如果过深入了解的朋友也欢迎分享)

Java中HashSet集合怎么对自定义对象进行去重

8. 得知了HashSet是通过hashcode()与equals()来进行去重,且自定义Object对象的equals()和hashcode()实现原理,那么要实现HashSet按照我们期望的方式,当两个对象所有属性的值一致时认定为同一个对象,我们可以对FootBallPlayer类的equals()和hashcode()进行重写,代码如下

Java中HashSet集合怎么对自定义对象进行去重

9. 重写完方法,我们再重新执行一开始的程序,还是同样的三个足球运动员实例。结果与期望相同,HashSet对“C罗”对象进行了去重处理。

Java中HashSet集合怎么对自定义对象进行去重

总结

HashSet的底层是对HashMap的操作,其去重的原理通过hashCode()与equals()方法来判断是否重复。通过实验发现自定义对象没有成功去重的原因与JDK默认的Object对象hashCode()和equals()实现有关。对于自定义对象的去重,我们可以通过重写自定义对象的hashCode()与equals()使其按照我们所想要的规则进行去重操作。

“Java中HashSet集合怎么对自定义对象进行去重”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯