1.先post这两个方法的基本定义:

equals()的定义:

浅谈Java中的equals和==(转)

hashCode()的定义:

java中hashCode()方法的作用

Java中hashCode的实现

这两个方法全部都是object类定义的方法,只要继承了object类的类,默认继承这两个方法。看源码,
(1)package java.lang.Object.equals()

  可见,默认这个方法是比较这两个引用对象的实际存储的内存地址是否相同。当然,即便是同一个类创建的两个对象,他们的内存地址也是不同的,所以,默认的equals()只有内存地址相同的对象(其实就是同一个引用对象的自己与自己的比较,这还有这样他们的地址才会相同),才会返回true。

当然,其他的很多类继承Object后,会对equals()进行重写,它会对两个对象的类型和对象内的内容进行比较,这个equals()对字符串相同的对象会得到true。可以看下String类中重写的equals()方法。

如下代码:

String s1="uiop0";
String s2="uiop0";
System.out.println(s1.equals(s2));

可以看下String类中重写的equals()方法。

    public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String)anObject;int n = value.length;if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;}

  

(2)package java.lang.Object.hashCode()

Object的hashCode()默认也是对两个对象存储地址值的哈希,所以,两个内容相同的对象的哈希值也会是不同的,所以重写hashCode()也是根据我们需求来修改hashCode()的功能,比如,String类的hashCode()的功能,对内容相同的字符串变量,会返回相同的哈希值。如果是调用Object的hashCode()方法,因为两个String变量是两个引用对象,返回的哈希值肯定不相等的。

看看String中的hashCode()源码:

   public int hashCode() {int h = hash;//默认hash=0if (h == 0 && value.length > 0) {char val[] = value;for (int i = 0; i < value.length; i++) {h = 31 * h + val[i];}hash = h;}return h;}

  可以看见,它是对两个字符串按照下面的规则,计算新的哈希值,这样算出的来两个相同字符串相变量哈希值是相等的。

 h = 31 * h + val[i];

 2.解释一下,为什么重写equals(),还需要重写hashCode()的原因

主要原因是定义的新的类在使用hashMap()是实际到,key值的计算问题。当我们用自定义的类的作为key时,怎么判断这相同的类对象的唯一性,这里涉及到hashMap()的判断机制,先比较hashCode(),当哈希值相同时,再比较equals(),这两个是配套的。

看先下面的详细解释:

转载于:https://www.cnblogs.com/zz22--/p/11453134.html

java -为什么重写equals(),还需要重写hashCode()?相关推荐

  1. java equals重写原则_java中为何重写equals时必须重写hashCode方法详解

    前言 大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 在上一篇博文Ja ...

  2. Java入门集合之Set集合(重写equals()和hashcode()方法)

    概述 Set接口继承Collection Set接口常用实现类 HashSet 实现了 Set 接口 "它不保证 set 的迭代顺序:特别是它不保证该顺序恒久不变"(存入该实现类对 ...

  3. 为什么重写Equals方法要重写HashCode方法

    目录 1.equals方法 2.hashcode方法 3.hash算法 4.重写equals方法 5.重写HashCode方法 在每个类中,重写equals方法的时侯,一定要重写hashcode方法. ...

  4. 为什么重写equals一定要重写hashCode方法?

    大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 下面我们看下Objec ...

  5. 重写equals为什么要重写hashcode

    一.equals()方法 equals是Object类的一个公有方法,在Java中,所有的类都会继承Object(包括数组),所以所有的类都有equals方法.他的用途也很明了,就是比较两个对象是否相 ...

  6. 为什么重写equals一定要重写hashcode?

    引言 这篇文章已经是我很久之前写的,其中的内容表述得不太清楚,或多或少难以让人信服,于是我又写了一篇,链接如下: CSDN链接:彻底搞懂为什么重写equals还要重写hashcode?  微信公众号链 ...

  7. 为什么重写equals方法必须重写hashcode方法

    想要知道这个问题,首先需要知道hashcode它的作用: HashCode的作用: 首先来看HashCode的作用,当把对象加入HashSet中时,HashSet会先计算对象的hashcode值来判断 ...

  8. java 为什么重写equals一定要重写hashcode?

    前言 最近复习,又看到了这个问题,在此记录和整理,通过例子来说明这种情况的原因,使大家可以清晰明白这个问题. 初步探索 首先我们要了解equals方法是什么,hashcode方法是什么. equals ...

  9. Java的重写equals但不重写hashCode方法的影响

    首先,说下equals和hashCode的关系.JDK API中关于Object类的equals和hashCode方法中说过,总结起来就是两句话:equals相等的两个对象的hashCode也一定相等 ...

  10. 重写equals就必须重写hashCode的原理分析

    因为最近在整理Java集合的源码, 所以今天再来谈谈这个古老的话题,因为后面讲HashMap会用到这个知识点, 所以重新梳理下. 如果不被重写(原生Object)的hashCode和equals是什么 ...

最新文章

  1. 2022-2028中国曝光机市场现状及未来发展趋势
  2. jupyter notebook快捷键总结及重要插件安装
  3. 键盘各个键对应的ASCLL值
  4. Java函数式接口看这一篇就够了
  5. rnn神经网络 层次_精讲深度学习RNN三大核心点,三分钟掌握循环神经网络
  6. Vue「三」—— vue 侦听器、vue 计算属性、vue-cli、vue 组件
  7. UE3 体积感光束教程
  8. libjpeg学习1:简单使用示例
  9. java.io.IOException: The temporary upload location [/tmp/tomcat.1XXXX] is not valid
  10. VB连接Mysql数据库
  11. 2016年的题目总结
  12. VMware Workstation PRO15  下 Win7镜像中LoadRunner安装
  13. pi/4QPSK调制解调原理
  14. 迅雷手机版苹果版_免费下载迅雷 iOS 版
  15. Zemax OpticsViewer
  16. 运行报错 」 No version of NDK matched the requested version 20.0.5594570. Versions available locally: 20.
  17. html5 预渲染,VUE预渲染及遇到的坑
  18. 快速搭建多用户共享桌面云环境 云教室环境搭建
  19. 物联卡套餐该如何选择
  20. 蓝奏云PHP解析接口,蓝奏云下载地址解析API[直链]

热门文章

  1. mysql55条_mysql学习笔记一
  2. 支持多分支语句吗_Go的条件判断语句
  3. git eclipse 取消误操作 ignore(忽略)文件
  4. RabbitMQ-Failed to check/redeclare auto-delete queue(s).
  5. Linux中locate命令查找文件位置
  6. Memcached与Redis的区别和选择
  7. 马斯克的挖隧道公司再下一城,未来或将首次实现短途通勤
  8. Spring MVC请求处理流程分析
  9. 组策略之文件夹的重定向
  10. Java线程池(3)- JUC Executors 源码分析