iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java中HashSet集合怎么对自定义对象进行去重
  • 607
分享到

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

2023-06-16 17:06:02 607人浏览 独家记忆
摘要

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

本篇内容介绍了“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()方法,发现其对于新入的元素是否重复判断依据为以下两种

  • 判断hash值是否相等,既通过判断hashCode()方法

  • 判断是否相等,通过equals()方法

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集合怎么对自定义对象进行去重

  • hashCode() 重写为hash值是通过对对象所有属性的值进行运算得出。

  • equals() 重写为先判断引用的对象是否是同一个,再判断对象每一个属性值是否相等

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

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

总结

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

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

--结束END--

本文标题: Java中HashSet集合怎么对自定义对象进行去重

本文链接: https://www.lsjlt.com/news/284582.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中HashSet集合怎么对自定义对象进行去重
    本篇内容介绍了“Java中HashSet集合怎么对自定义对象进行去重”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java中Set接口是Co...
    99+
    2023-06-16
  • java List<对象> 根据对象的一个属性进行去重
    1.如果你想根据对象的一个属性进行去重,可以使用Java 8中的Stream API。具体步骤如下: 实现一个自定义函数,该函数将用于确定两个对象是否相等,例如: public static Predicate distinctByPro...
    99+
    2023-09-01
    java list
  • 怎么在java中对集合进行排序
    这篇文章将为大家详细讲解有关怎么在java中对集合进行排序,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于...
    99+
    2023-06-14
  • 在Spring4中怎么对@Value进行自定义
    本篇文章为大家展示了在Spring4中怎么对@Value进行自定义,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。@Value在Spring中,功能非常强大,可以注入一个配置项,可以引用容器中的Bea...
    99+
    2023-05-31
    spring4 @value ue
  • JavaScript怎么自定义对象
    这篇文章主要介绍“JavaScript怎么自定义对象”,在日常操作中,相信很多人在JavaScript怎么自定义对象问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaSc...
    99+
    2024-04-02
  • 【java】List对象集合去除特定对象的优雅写法(基于java8)
    【java】List对象集合去除特定对象的优雅写法(基于java8) 主要用的是 Java List.removeIf方法,该方法用于删除所有满足特定条件的数组元素,入参其实是一个布尔值的表达式即可。 使用场景,用户类中的性别字段有三个,分...
    99+
    2023-08-17
    java servlet 开发语言
  • java怎么定义json对象
    在Java中,可以使用`JSONObject`类来定义JSON对象。首先,需要导入`org.json.JSONObject`包。然后...
    99+
    2023-08-26
    java json
  • 怎么在Java中对TreeSet进行自定义类型的排序
    怎么在Java中对TreeSet进行自定义类型的排序?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java可以用来干什么Java主要应用于:1. web开发;2. Androi...
    99+
    2023-06-06
  • Java 中如何对集合进行排序
    Java 中如何对集合进行排序 在 Java 中,集合是一种非常常见的数据结构,它可以用来存储一组元素,而且可以动态地增加或删除元素。在实际的开发中,我们经常需要对集合中的元素进行排序,以便更方便地查...
    99+
    2023-09-25
    java 开发语言
  • Java中如何使用重定向对象进行自然语言处理?
    随着人工智能技术的快速发展,自然语言处理(NLP)已经成为了越来越受关注的热门技术。在Java编程中,我们可以使用重定向对象来实现自然语言处理。 什么是重定向对象? 重定向对象是Java中的一个内置类,它允许我们将标准输入,标准输出和标准...
    99+
    2023-07-26
    重定向 对象 自然语言处理
  • 利用java怎么对集合的子集进行求解
    利用java怎么对集合的子集进行求解?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 java求解集合的子集的实例方式1:我们知道子集个数 2的n次方比如a,b,c...
    99+
    2023-05-31
    java ava
  • JavaScript中怎么定义对象
    本篇文章给大家分享的是有关JavaScript中怎么定义对象,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、JavaScript对象的定义J...
    99+
    2024-04-02
  • 如何利用Java中的重定向对象进行自然语言处理?
    自然语言处理(NLP)是人工智能领域中的一个重要分支,它旨在使计算机能够理解、解析和生成人类语言。Java语言作为一种广泛使用的编程语言,提供了许多用于NLP的工具和库。本文将介绍Java中的重定向对象,并演示如何使用它们进行自然语言处理。...
    99+
    2023-07-26
    重定向 对象 自然语言处理
  • Linux 下如何使用 Java 对象进行重定向?
    在 Linux 下,Java 应用程序常常需要进行文件的输入输出操作,而在实际应用中,我们经常需要将输出结果重定向到文件中,以便后续的处理。本文将介绍如何使用 Java 对象进行重定向操作,并给出相关的代码实例。 一、使用 System....
    99+
    2023-10-10
    重定向 linux 对象
  • Java中List集合去重方法以及效率对比
    List集合相信大家在开发过程中几乎都会用到。有时候难免会遇到集合里的数据是重复的,需要进行去除。然而,去重方式有好几种方式,你用的是哪种方式呢?去重方式效率是否是最高效、最优的呢?...
    99+
    2024-04-02
  • Linux 中如何使用 Java 对象进行重定向操作?
    在Linux中,Java对象的重定向操作是非常常见的。重定向操作是将输出从一个文件描述符或一个命令重定向到另一个文件描述符或命令的过程。在Java中,我们可以使用System类的setOut方法来重定向输出流。 以下是如何在Linux中使用...
    99+
    2023-10-10
    重定向 linux 对象
  • 怎么在golang中对Map进行键值自定义排序
    本篇文章为大家展示了怎么在golang中对Map进行键值自定义排序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。golang适合做什么golang可以做服务器端开发,但golang很适合做日志处理、...
    99+
    2023-06-14
  • 如何使用自定义hooks对React组件进行重构
    这篇文章主要介绍了如何使用自定义hooks对React组件进行重构的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用自定义hooks对React组件进行重构文章都会有所收获,下面我们一起来看看吧。处理复杂性...
    99+
    2023-07-05
  • 怎么在java中对对象的类型进行转换
    怎么在java中对对象的类型进行转换?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。对象类型转换分为向上转型和向下转型(强制对象转型)。 向上转型是子对象向父对象转型的过程,例如...
    99+
    2023-05-30
    java
  • Java中Collection集合常用API之 Collection存储自定义类型对象的示例代码
    目录Collection常用APICollection存储自定义类型对象Collection常用API Collection集合API Collection是单列集合的祖宗接口,因此...
    99+
    2022-12-21
    Java  Collection存储自定义类型对象 Collection集合常用API java Collection集合
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作