hashCode()与equals(Object obj)都是Java Object对象中的方法,也就是说Java的一切对象都提供这么两个方法。这两个方法在Java中有着不一般的联系;在Java类操作中,也起着至关重要的计算依据。

大家都知道,Java中有两大集合体系(Collection与Map),从这两个类衍生出来的实现类为大家日常使用的类(HashMap,ArrayList,LinkedList等等),而大多数集合类中判断是否增加元素使用的就是对象中的hashCode()与equals(Object obj)方法;当面试中面试官抛出(hashCode与equals方法有什么联系时),应该分情况说明

一:当对象没有重写hashCode()与equals(Object obj)方法

回答:当equals相等时,hashCode一定相等;equals不等时,hashCode一定不等 
解释:此时对象调用的Object中的hashCode与equals方法;equals比较的是内存地址,hashCode的值为内存地址的计算哈希结果值

如下为Jdk1.8 Object对象中hashCode方法的注释

If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result
(中文翻译:如果两个对象根据equals(Object)方法相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果) It is not required that if two objects are unequal according to the java.lang.Object.equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results
(中文翻译:根据java.lang.Object.equals(java.lang.Object)方法,如果两个对象不相等,则不需要,因此在两个对象中的每个对象上调用hashCode方法必须产生不同的整数结果)
 
  • 1
  • 2
  • 3
  • 4
  • 5

二: 当对象重写hashCode(),保留equals(Object obj)方法

回答:当equals相等时,hashCode一定相等;equals不等时,hashCode可能相等,也可能不等 
解释:equals方法在Object对象中比较的是内存地址,equals相同则表明为同一个对象,hashCode获取的是同一个hashCode方法返回值;那为什么equals不等时,还是出现hashCode相等的情况呢? 
例子:

public class Demo {
private Integer id; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = super.hashCode();
} @Override
public int hashCode() {
return id;
} }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

当new两个Demo对象,赋值id都是1;地址不相等,但hashCode是否相等呢?

三: 当对象保留hashCode(),重写equals(Object obj)方法

回答:equals可能相等,也可能不等;hashCode一定不等 
解释:hashCode调用的是Object的hashCode方法,根据对象内存地址计算哈希值,两个内存地址不相同的对象,hashCode一定不相等;equals是否相等,取决于重写的方法怎么写。 
例子:

public class Demo {
private Integer id; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} @Override
public boolean equals(Object obj) {
if (obj instanceof Demo) {
Demo o = (Demo) obj;
return o.getId().intValue() == this.getId();
}
return false;
}
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

重写的equals方法实际比较的是两个对象的id值,当两个对象的Id值一致时,则equals相等

Java面试中hashCode()与equals(Object obj)方法关系的准确回答的更多相关文章

  1. java中hashcode和equals的区别和联系

    HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...

  2. 面试题:我们重写一个对象的时候为什么要同时重写hashcode()和equals()方法

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 在创建的类不重写hashCode()和equals() 方法时,默认使用 java 提供的 java.l ...

  3. Java面试系列第2篇-Object类中的方法

    Java的Object是所有引用类型的父类,定义的方法按照用途可以分为以下几种: (1)构造函数 (2)hashCode() 和 equals() 函数用来判断对象是否相同 (3)wait().wai ...

  4. java中hashcode()和equals()的详解

    今天下午研究了半天hashcode()和equals()方法,终于有了一点点的明白,写下来与大家分享(zhaoxudong 2008.10.23晚21.36). 1. 首先equals()和hashc ...

  5. java中hashCode()与equals()详解

    首先之所以会将hashCode()与equals()放到一起是因为它们具备一个相同的作用:用来比较某个东西.其中hashCode()主要是用在hash表中提高 查找效率,而equals()则相对而言使 ...

  6. java中 hashCode() 和 equals()

    1. 值类型是存储在内存中的栈,而引用类型的变量在栈中仅仅是存储引用类型变量的地址来自堆,而其本身则存储在栈中. 2. ==操作比较的是两个变量的值是否相等, 3. 对于引用型变量表示的是两个变量在堆 ...

  7. Java中HashCode()和equals()的作用

    引言 我们知道Java中的集合(Collection)大致可以分为两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复. 这里就引出一个问题: ...

  8. Java中hashCode、equals、==的区别

    ref:http://www.cnblogs.com/skywang12345/p/3324958.html 1.==作用: java中的==用来判断两个对象的地址是否相等:当对象是基本数据类型时,可 ...

  9. Java中hashcode,equals和==

    hashcode方法返回该对象的哈希码值. hashCode()方法可以用来来提高Map里面的搜索效率的,Map会根据不同的hashCode()来放在不同的位置,Map在搜索一个对象的时候先通过has ...

随机推荐

  1. 深度学习之(经典)卷积层计算量以及参数量总结 (考虑有无bias,乘加情况)

    目录: 1.经典的卷积层是如何计算的 2.分析卷积层的计算量 3.分析卷积层的参数量 4.pytorch实现自动计算卷积层的计算量和参数量 1.卷积操作如下: http://cs231n.github ...

  2. css实现斑马线效果

    文本实现斑马线效果 <style> p { font-size: 17px; line-height: 25px; background-color: antiquewhite; back ...

  3. python基础知识之数据类型

    一.与用户的交互 古时候,我们去银行取钱,需要有一个银行业务员等着我们把自己的账号密码输入给他, 然后他去进行验证,成功后,我们再将取款金额输入/告诉他 骄傲的现代人,会为客户提供一台ATM机(就是一 ...

  4. 雷电模拟器 v3.71绿色版

    目录 1. 按 2. 介绍 3. 下载地址 1. 按 安卓模拟器目前的市场基本上稳定了,逍遥.夜神.雷电,用的人都很多,网易mumu从阴阳师时代就被大家熟知,腾讯手游助手也是随着吃鸡游戏而火,这两个模 ...

  5. PCA原理推导及其在数据降维中的应用

    一个信号往往包含多个维度,各个维度之间可能包含较强的相关性.下图表示的是一组二维信号x=(x1,x2),可以看到数据点基本上分布在x2=x1这条直线上,二者存在很强的相关性(也就是确定x1之后,就能确 ...

  6. /proc/sys/fs/file-max

    Linux的/proc/sys/fs/file-max决定了当前内核可以打开的最大的文件句柄数. 查看当前的值: cat /proc/sys/fs/file-max 这个值在kernel的文档里是这样 ...

  7. Nginx cpu亲和性调整

    意义 Nginx默认没有开启利用多核cpu,我们可以通过worker_processes指令来启动多个worker,但是worker最终运行在哪些cpu核上是系统层进行调度的:我们可以通过增加work ...

  8. Stack Overflow 推荐编程书单

    Stack Overflow 推荐编程书单   1 Working Effectively with Legacy Code Michael C. Feathers 修改代码是每一位软件开发人员的日常 ...

  9. bzoj4011 [HNOI2015]落忆枫音 拓扑排序+DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4011 题解 首先考虑如果没有那么一条被新加进来的奇怪的边的做法. 我们只需要给每一个点挑一个父 ...

  10. 绑定class -vue

    1.值为对象 :class = "{ 'text-red': isActive }" data () { return { isActive : true } } :class = ...