出自:http://blog.csdn.net/renfufei/article/details/16339351

Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类。Ojbect类中有两个方法equals、hashCode,这两个方法都是用来比较两个对象是否相等的。在没有重写equals方法我们是继承了object的equals方法,那里的 equals是比较两个对象的内存地址,显然我们new了2个对象内存地址肯定不一样。

对于基本数据类型,==比较的是两个变量的值。对于引用对象,==比较的是两个对象的地址。默认的equals方法等同==,一般来说我们的对象都是引用对象,要重写equals方法。

对equals方法进行了重写,建议一定要对hashCode方法重写,以保证相同的对象返回相同的hash值,不同的对象返回不同的hash值。

1. 错误使用方式
下面是一个常见的错误用法:

import java.util.HashMap;public class Apple {private String color;public Apple(String color) {this.color = color;}public boolean equals(Object obj) {if (!(obj instanceof Apple)) {return false;}if (obj == this) {return true;}return this.color == ((Apple) obj).color;}public static void main(String[] args) {Apple a1 = new Apple("green");Apple a2 = new Apple("red");//hashMap stores apple type and its quantityHashMap<Apple, Integer> m = new HashMap<Apple, Integer>();m.put(a1, 10);m.put(a2, 20);System.out.println(m.get(new Apple("green")));}
}

在此示例中,hashMap 已经保存了一个绿色的Apple对象,但想(通过程序中的方式)从map获取此对象时,apple 对象并未被找到.
上述代码的输出结果是: null. 但通过断点调试,可以确定此对象已经存在于hashMap中,截图如下:

2. 此问题由hashCode()引起
问题的原因是没有重写"hashCode()"方法.
equals()方法与hashCode()的通用协定是:
2.1 如果两个对象相等(equal),那么必须拥有相同的哈希码(hash code)
2.2 即使两个对象有相同的哈希值(hash code),他们不一定相等.
Map的核心思想就是可以比线性查找更快. 通过散列值(hash)作为键(key)来定位对象的过程分为两步:
在Map内部,存储着一个顶层数组,顶层数组的每个元素指向其他的数组,查找或存储的时候,先根据key对象的hashCode()值计算出数组的索引,然后到这个索引找到所指向的第二层线性数组,使用equals方法来比较是否有相应的值(以返回或者存储).
Object类中的hashCode()默认为每个对象返回不同的int值,因此在上面的例子中,两个相等(equal)的对象,返回了不同的hashCode值.
解决方法是为此类添加hashCode方法,比如,使用color字符串的长度作为示范:

public int hashCode(){ //此种实现,要求 color值定以后就不得修改//否则同一个物理对象,前后有两个不同的hashCode,逻辑上就是错的return this.color.length();
}

转载于:https://www.cnblogs.com/cnweiblog/p/3742740.html

重写equals()与hashCode()方法相关推荐

  1. Java重写equals和hashCode方法

    在日常程序中,我们习惯使用equals方法来比较两个对象,继承自Object的equals方法默认的比较两个对象的内存地址(String类重写了equals方法,比较字符串的内容).假如我们创建了两个 ...

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

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

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

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

  4. hash 值重复_程序员:判断对象是否重复,不重写equals和hashcode不行吗?

    前言 大家都知道如果要判断一个对象是否相同,都要在对象实体中重写equals和hashcode方法,那你知道为什么重写这两个方法就能根据自己定义的规则实现相等比较了吗? 今天带大家来了解一下equal ...

  5. 【Java基础】之深入讨论equals()和hashcode()方法

    这篇文章将详解介绍 Java 的 equals() 与 hashCode() 方法 我们知道 Object 类是类继承结构的基础,所以是每一个类的父类,所有的对象,包括数组,都实现了在 Object ...

  6. 为什么使用HashMap需要重写hashcode和equals方法_不同时重写equals和hashCode又会怎样?听听过来人的经验...

    可能一问到equals和hashCode相关的问题,就会有人讲他们的自反性,对称性,一致性,传递性等几条约定了,此时我不得不佩服,这么多约定竟然都能记得,但我不知道你是不是真的理解呢. 一.我不同时重 ...

  7. 不同时重写equals和hashCode又会怎样?

    作者:flyhero 微信公众号:码上实战(ID:Push-Code) 可能一问到equals和hashCode相关的问题,就会有人讲他们的自反性,对称性,一致性,传递性等几条约定了,此时我不得不佩服 ...

  8. Java基础提升篇:equals()与hashCode()方法详解

    概述 java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) public int hashCode() Object类是类继承 ...

  9. List去重为什么要写equals(),hashCode()方法

    一,各个集合的特点: Collection(集合):容器,用于存放对象(引用类型.基本类型需要自动装箱) List(列表):元素有序,元素可以重复 (有索引). 通过元素的equals()方法判断是否 ...

最新文章

  1. 什么是POM maven
  2. 如何将JavaScript数组信息导出到csv(在客户端)?
  3. java创建文件和目录
  4. 深度学习(二十二)Dropout浅层理解
  5. php imap配置,php中的自定义IMAP命令
  6. CUDA 10[Linux]最新 百度云下载[免费]
  7. 西塘游(2007-08-14)
  8. 移动app测试的多样性_移动App测试一些崩溃原因及触发崩溃的场景
  9. 偏微分方程数值解法pdf_单摆-微分方程浅谈
  10. 西门子200程序案例集
  11. 京东Java面试题、笔试题(含答案)
  12. 关于银行卡四要素返回数据解析问题
  13. Android隐藏app应用图标
  14. 题目---小Q定义了一种数列称为翻转数列: 给定整数n和m, 满足n能被2m整除。对于一串连续递增整数数列1, 2, 3, 4..., 每隔m个符号翻转一次, 最初符号为'-';。
  15. ps因计算机限制打不开,电脑突然坏了只有打不开PS这是什么原因在线 – 手机爱问...
  16. Cocos Creator之打包设置横竖屏
  17. 每日一句—英语长难句
  18. ios获取磁力计信息
  19. 新梦想计算机等级考试2016,2016年计算机等级一级考试试题及解析
  20. app自定义view后按键音失效

热门文章

  1. numpy拼接多维数组(numpy.concatenate命令详解)
  2. win7安装TensorFlow-gpu 2.3详细教程(CUDA10.1,cuDNN7)
  3. 自然语言处理 —— 2.7负采样
  4. Selenium不打开浏览器采爬取数据 Java
  5. python用符号计算检验多维数组的计算
  6. Matlab一个窗口中绘制多个图形
  7. Opencv透视变换——cv::getPerspectiveTransform()与cv::warpPerspective()详解
  8. freertos 创建互斥量_FreeRTOS的信号量和互斥量
  9. java语句类型_01-java数据类型与语句
  10. DevPartner Studio Professional Edition 11 内存泄露检测使用