List集合去除重复对象及equals()、hashCode()方法的作用
来源:互联网 发布:js如何获取class的值 编辑:程序博客网 时间:2024/06/14 15:59
在Java中,要将一个集合中重复的对象除去,如果这个集合中的数据类型是基本数据类型,可以直接将list集合转换成set,就会自动去除重复的元素,大家都知道set集合的特点就是没有重复的,这个就相对比较简单,这里不在详细说,我们下面说的list集合中的数据类型是一个对象类型的。
当list集合中存储的类型是对象类型的时候,我们就不能简单的只把list集合转换成set集合就行了,这时我们需要在对象的实体类中去重写equals()方法和hashCode()方法,我们以一个list集合为例,在该例中,我们将People实体类中姓名和电话号码作为判断该对象重复的标识,在People的实体类中我们重写这两个方法如下:
以上实体类中,我们在equals()方法中取出该对象的name和phoneNumber这两个属性值去判断比较,然后在重写的hashCode()方法中返回这两个属性值得hashCode值。 运行这段代码之后,我们就会发现,在原来的list集合中姓名和电话号码都相同的对象就被会认为是重复的元素而删除掉,很明显运行结果已经达到我们的目的。这里需要说一下equals()方法和hashCode()方法,一般情况下我们重写equals()方法的时候都要去重写hashCode()方法,这是为什么呢?大家不妨可以这样去试一试上面那个例子,在实体类中将重写的hashCode()方法注释掉,再去运行该程序,这时就会发现运行结果并不是我们刚刚得到的结果,在set集合中,并没有将我们认为是重复的元素删除掉,下面我们通过这两个方法的源码去了解一下:
String类中的equals()方法的源码如下
通过观察equals()方法的源码我们可以看出,该方法去比较两个对象时,首先先去判断两个对象是否具有相同的地址,如果是同一个对象的引用,则直接放回true;如果地址不一样,则证明不是引用同一个对象,接下来就是挨个去比较两个字符串对象的内容是否一致,完全相等返回true,否则false。String类中hashCode()方法的源码如下
以上是String类中重写的hashCode()方法,在Object类中的hashCode()方法是返回对象的32位JVM内存地址,也就是说如果我们不去重写该方法,将会返回该对象的32位JVM内存地址,以上我们测试的例子中,当注释掉重写的hashCode()方法时,这时默认返回对象的32JVM中的地址,两个不同的对象地址显然是不同的,我们在比较时,虽然通过重写的equals()方法比较出来name和phoneNumber值是相同的,但是默认的hashCode()方法返回的值他们并不是同一个对象,所以我们通常要将hashCode()方法与equals()方法一起重写,以维护hashCode方法的常规协定,该协定声明相等对象必须具有相等的哈希码。上一篇博客的java中 的hashCode的作用,用白话说,通过hashCode判断对象是否放在同一个桶里,然后再通过equals方法去判断这个桶里的对象是不是相同的,这个比喻也挺形象的。
关于hashCode方法的作用大家可以看看这篇博客http://blog.csdn.net/qq_31387691/article/details/54090039
- List集合去除重复对象及equals()、hashCode()方法的作用
- List集合去除重复对象及equals()、hashCode()方法的作用
- List集合去除重复对象及equals()、hashCode()方法的作用
- List集合去除重复对象及equals()、hashCode()方法的作用
- 向HashSet集合存入对象,去除重复元素(覆写equals和hashCode方法)
- list集合去除重复对象的实现
- list集合去除重复对象
- list集合去除重复对象
- List集合去除重复对象
- List集合去除重复对象
- list集合去除重复对象
- list集合去除重复对象
- list集合去除重复对象
- hashcode、equals和compareTo、compare方法的意义及作用
- 对象的比较及hashCode、equals方法的使用
- java中去除List集合中重复数据的方法
- 去除list集合中重复项的几种方法
- 去除list集合中重复项的几种方法
- BPM配置故事之案例12-触发另外流程
- Stm32调试之assert_param() 断言机制
- H264三种码率控制方法(CBR, VBR, CVBR)
- java小型web框架
- 【TV】海信在CES发布电视新品
- List集合去除重复对象及equals()、hashCode()方法的作用
- 12.JAVA基本数据类型
- BPM配置故事之案例13-触发消息通知
- CS架构和BS架构的区别
- API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安全。
- 使用glide填过的各种坑
- openstack中代码调试方法
- 比特币核心钱包(Bitcoin Core)的使用入门指南
- 人文胜地