在日常程序中,我们习惯使用equals方法来比较两个对象,继承自Object的equals方法默认的比较两个对象的内存地址(String类重写了equals方法,比较字符串的内容)。假如我们创建了两个Person对象,二者同名同姓,我们认为二者相同,但若是用equals方法比较二者,由于内存地址不同,返回的仍是false。因此我们需要重写equlas方法,以我们的视角来建立规则。我们以实例来分析:

我们创建一个类并重写其equals方法,并创建两个对象person1和person2对象,然后比较二者。

1.重写equals方法

public class Person {private String name;private int age;@Overridepublic boolean equals(Object obj) {// TODO Auto-generated method stubif (this == obj) {// 如果二者引用的为同一个对象,则返回truereturn true;}if (obj == null) {// 如果比较的对象为null,返回falsereturn false;}if (obj.getClass() != this.getClass()) {return false;//如果二者不是同一类对象,则返回false}Person person=(Person)obj;if(person.getName().equals(getName())&&person.getAge()==getAge()){return true;}return false;}public void setAge(int age) {this.age = age;}public int getAge() {return age;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

通过测试,并将两个对象存放到HashSet之中,代码如下:

public class TestDemo {Set<Person> set=new HashSet<Person>();//定义一个HashSet存放person对象@Testpublic void test1(){Person person1=new Person();person1.setName("zhang");person1.setAge(18);Person person2=new Person();person2.setName("zhang");person2.setAge(18);System.out.println("返回结果:"+person1.equals(person2));set.add(person1);set.add(person2);System.out.println("set存在"+set.size()+"个对象\n"+set);}
}

结果如下所示:

返回结果:true
set存在2个对象:[com.zhang.demo.Person@1ceebfa, com.zhang.demo.Person@1e6743e]

此时我们发现一个问题,虽然通过重写equals方法判断两个对象相等,但二者都存入到了set之中。纳尼?众所周知,set中只能存入不同的对象,显然对于HashSet来说,仅仅重写equals方法是不够的(对于HashMap也一样),通过了解集合比较对象的原理,我们才知道,原来集合先比较两个对象的HashCode是否相等,若相等,则通过equlas方法比较,若两个方法都通过,则两个对象被视为同一个对象。接下来,我们再将hashCode方法重写。

2.重写harshcode方法

public int hashCode() {// TODO Auto-generated method stubint prime = 31;// 只要为素数就可以int result = 1;result=result*prime+(name==null?0:name.hashCode());result=result*prime+age;return result;}

然后在通过以上的测试方法测试,结果如下:

返回结果:true
set存在1个对象:[com.zhang.demo.Person@d6168d67]

此时,HashSet之中只存入了一个对象。

Java重写equals和hashCode方法相关推荐

  1. Java:重写equals()和hashCode()

    http://blog.csdn.net/ansel13/article/details/5437486 很基础的东西就是由于没上心,三番五次地出错,这次好好总结下吧. 众所周之,String .Ma ...

  2. Java拾遗:001 - 重写 equals 和 hashCode 方法

    2019独角兽企业重金招聘Python工程师标准>>> 重写equals方法 在Java中Object类是一个具体类,但它设计的主要目的是为了扩展,所以它的所有非final方法,都被 ...

  3. Java重写equals()和hashCode()

    1.何时需要重写equals() 当一个类有自己特有的 "逻辑相等"概念(不同于对象身份的概念). 2.设计equals() [1]使用instanceof操作符检查 " ...

  4. 深入理解Java的equals和hashCode方法

    1.谈谈equals方法 相信大家对这个这个方法一定不陌生.该方法是Object基类里的非final方法(被设计成可覆盖的),下面我们来看看Object中是如何实现该方法的.源代码如下: public ...

  5. Java:重写equals()和hashCode() 1

    來源: 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhangjunhd.blog.51cto.com/113473 ...

  6. hashCode之二--Java:重写equals()和hashCode()

    以下内容总结自<Effective Java>. 1.何时需要重写equals() 当一个类有自己特有的"逻辑相等"概念(不同于对象身份的概念). 2.设计equals ...

  7. 学习Java编程equals()和hashCode()方法

    equals()和hashCode()区别? equals():反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值. hashCode():计算出对象实例的哈希 ...

  8. 重写equals()与hashCode()方法

    出自:http://blog.csdn.net/renfufei/article/details/16339351 Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类.Oj ...

  9. 重写equals()和hashcode()方法详解

    本文将通过一个示例程序来深入讲解java的equals()方法 1.示例程序: package cn.galc.test;public class TestEquals {public static ...

最新文章

  1. 关于U盘安装ubuntu-18.04安装时候出现的grub-efi-amd64-signed的问题。
  2. 成功解决ValueError: attempted relative import beyond top-level package
  3. lucene 第一天
  4. 【tensorflow】tensorflow -gpu安装及jupyter环境更改
  5. 直方图均衡 视觉显著_视觉图像:对比度受限直方图均衡化CLAHE
  6. java创建读取文件_Java实现文件的创建、读取、写入操作-Fun言
  7. 鼬电脑壁纸_火影忍者高清壁纸需要自取1080p
  8. Java-常见的工具类-字符串
  9. 【maven】maven pom文件详解
  10. [译]C语言实现一个简易的Hash table(2)
  11. 物理学的过去、现在与未来
  12. html如何设置按钮背景为透明,css 设置按钮(背景色渐变、背景色透明)
  13. pg_auto_failover 之四 manual failover
  14. Jetson Nano资料合集
  15. 安卓webview长按分享,长按选择,长按复制,仿好奇心日报长按分享自定义弹窗的实现
  16. 浪潮集团执行总裁王洪添一行莅临柏睿数据公司商讨战略合作
  17. 储种_定活两便_整存整取_and so on
  18. verilog-10101状态机序列检测器的设计
  19. 安装SQLnbsp;SERVERnbsp;2000最后提示“安装…
  20. 【深度学习】(一)感知机:与门、与或门、或门、异或门

热门文章

  1. C++知识点10——函数指针
  2. OnInitDialog()函数
  3. rust编程之道 pdf_深挖一篇嵌入式内核论文之后,我发现 Rust 正在悄悄改变世界...
  4. 线程不安全 静态变量_ArrayList线程不安全,JUC是如何处理的
  5. python mysql绑定变量_python 数据库绑定变量
  6. Map集合遍历的四种方式理解和简单使用
  7. Android提示版本号更新操作流程
  8. 利用Maven搭建Spring开发环境 【转】
  9. ubuntu 安装RPM软件包
  10. 自定义UIViewController的过渡效果