专栏首页陈黎栋的专栏啦学习笔记-JAVA-考点10-什么情况下需要重写equals和hashcode()两个方法?

学习笔记-JAVA-考点10-什么情况下需要重写equals和hashcode()两个方法?

一、什么情况下需要重写equals和hashcode()两个方法?

1、加入到hashset中的自定义类的对象,为确保他们不重复,需要对他们的类重写equals()和hashcode()的方法。

如果不重写equals,相同内容不同引用的对象会被当做不同的对象被加入到hashset中。

重写equals()的示例代码:

public boolean equals(Object obj){//这里不可以写成自定义类型自定义类型引用,这样集
<span style="white-space:pre">				</span>  //合框架的底层不会调用这个重载的方法。
<span style="white-space:pre">	</span>if(!(obj instanceof Person)){
<span style="white-space:pre">		</span>return false;
<span style="white-space:pre">	</span>}
 
<span style="white-space:pre">	</span>Personp =(Person)obj;
 
<span style="white-space:pre">	</span>//用来查看equals方法是否被调用
<span style="white-space:pre">	</span>sop(this.name +".......equals......."+ p.name);
<span style="white-space:pre">	</span>//认为名字相同并且年龄一样大的两个对象是一个
<span style="white-space:pre">	</span>return this.name.equals(p.name) && this.age == p.age;
}

测试结果:

【结论】循环迭代结果:a2::12被打印了两次,说明重复的元素new Person("a2", 12)被添加到集合中去。没有保证HashSet的唯一性。

同时equals没有被调用,说明仅仅重写equals方法没起到作用

二、不是重写equals就够啦吗,为什么这里还要重写hashcode()?

答:hashset在存储对象时,先判断两个对象的hash值是否一样,只有在hashcode()相等的前提下equals()也相等,才认为两个对象时同一个。

重写hashcode的示例代码:

public int hashCode(){ sop(this.name +"......hashCode"); return this.name.hashCode() + 29*age; }

三、ArrayList的机制又是怎样的?

[1]. HashSet判断、删除和添加元素等操作依据的是被操作元素所在的类的hashCode()和equals( )这两个方法。

[2]. ArrayList做同等的操作,依据的仅仅是equals( )方法

参考:http://blog.csdn.net/benjaminzhang666/article/details/9468487#

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • OpenKG数据逐一截图说明

    可能与三元组相关的标签(一个数据集可能有多个标签)的总计数为 51,不算特别多,所以我打算把每个数集看一下,看看有没有 满足大小在 1G-10G

    陈黎栋
  • 计算机网络·端口连接和测试笔记

    测试本机端口对外开放情况,在本机上请求本机对外的ip地址即可,不一定需要在其他机器上。

    陈黎栋
  • 用钓鱼的例子讲Linux五种网络IO模型

    网络I/O的本质是socket的读取,socket在linux系统被抽象为流,I/O可以理解为对流的操作。这个操作又分为两个阶段:

    陈黎栋
  • 详解 equals() 方法和 hashCode() 方法

    Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码。equals()和ha...

    用户1257393
  • Yapi cross-request支持文件上传的解决方案

    chrome 在 73 版本后,限制了 content-script 跨域请求目前只有一个解决办法,废弃 content-script 跨域请求,使用backg...

    咻咻ing
  • 详解equals()方法和hashCode()方法

    Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码。equals()和ha...

    wuweixiang
  • Java源码之ThreadLocal

    详细介绍一下ThreadLocal是如何实现为线程提供变量副本的,方便下面源码的理解: 首先我们要知道每个线程下都有一个私有变量map,当我们使用Thread...

    每天学Java
  • Atom主题插件美化教程

    对应的Themes就是可更换的主题。在这一共分为两块,UI Theme和Syntax Theme,一个是UI的,一个是文件语法的,这里可以选择相应的主题。

    慕白
  • Huginn 环境搭建

    Huginn 是一个可以通过构建 agents 来帮你实现在线自动化任务的系统。它们可以理解 web,监听事件,按你所需地去执行一些行为。Huginn 的 ag...

    huginn 中文网
  • hanlp中的N最短路径分词

    N-最短路径 是中科院分词工具NLPIR进行分词用到的一个重要算法,张华平、刘群老师在论文《基于N-最短路径方法的中文词语粗分模型》中做了比较详细的介绍。该算法...

    用户3492023

扫码关注云+社区

领取腾讯云代金券