Java面试中hashCode()与equals(Object obj)方法关系的准确回答
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)方法关系的准确回答的更多相关文章
- java中hashcode和equals的区别和联系
HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...
- 面试题:我们重写一个对象的时候为什么要同时重写hashcode()和equals()方法
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 在创建的类不重写hashCode()和equals() 方法时,默认使用 java 提供的 java.l ...
- Java面试系列第2篇-Object类中的方法
Java的Object是所有引用类型的父类,定义的方法按照用途可以分为以下几种: (1)构造函数 (2)hashCode() 和 equals() 函数用来判断对象是否相同 (3)wait().wai ...
- java中hashcode()和equals()的详解
今天下午研究了半天hashcode()和equals()方法,终于有了一点点的明白,写下来与大家分享(zhaoxudong 2008.10.23晚21.36). 1. 首先equals()和hashc ...
- java中hashCode()与equals()详解
首先之所以会将hashCode()与equals()放到一起是因为它们具备一个相同的作用:用来比较某个东西.其中hashCode()主要是用在hash表中提高 查找效率,而equals()则相对而言使 ...
- java中 hashCode() 和 equals()
1. 值类型是存储在内存中的栈,而引用类型的变量在栈中仅仅是存储引用类型变量的地址来自堆,而其本身则存储在栈中. 2. ==操作比较的是两个变量的值是否相等, 3. 对于引用型变量表示的是两个变量在堆 ...
- Java中HashCode()和equals()的作用
引言 我们知道Java中的集合(Collection)大致可以分为两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复. 这里就引出一个问题: ...
- Java中hashCode、equals、==的区别
ref:http://www.cnblogs.com/skywang12345/p/3324958.html 1.==作用: java中的==用来判断两个对象的地址是否相等:当对象是基本数据类型时,可 ...
- Java中hashcode,equals和==
hashcode方法返回该对象的哈希码值. hashCode()方法可以用来来提高Map里面的搜索效率的,Map会根据不同的hashCode()来放在不同的位置,Map在搜索一个对象的时候先通过has ...
随机推荐
- js 全世界最短的IE浏览器判断代码
var ie = !+"\v1"; 仅仅需要7bytes!参见这篇文章,<32 bytes, ehr ... 9, ehr ... 7!!! to know if your ...
- nologin - 阻止非root用户登录系统
描述 DESCRIPTION 如果存在文件 /etc/nologin, login(1) 将只允许root访问.其它用户的登录会遭到拒绝并且显示该文件中的内容给他们. 文件 FILES /etc/no ...
- 关于jsp删除成功,添加成功等之后 页面自动跳转的js写法
因为比较常用,所以写在博客里保存起来,防止以后忘了不会写了: 删除成功,<span id="time" style="background:red"> ...
- AtCoder Regular Contest 092 Two Sequences AtCoder - 3943 (二进制+二分)
Problem Statement You are given two integer sequences, each of length N: a1,…,aN and b1,…,bN. There ...
- (最新)2019年ICPC东亚地区-区域赛赛站网络赛以及现场赛时间安排
- css3-文字与字体
1. 给文字添加阴影---text-shadow 语法: text-shadow: X-Offset Y-Offset blur color; X-Offset:表示阴影的水平偏移距离,其值为正值时阴 ...
- java日志文件log4j.properties配置详解
一.Log4j配置 第一步:加入log4j-1.2.8.jar到lib下. 第二步:在CLASSPATH下建立log4j.properties.内容如下: 放在src下的话就不用配置 否则得去web. ...
- pyqt5-橡皮筋控件QRubberBand
提供一个矩形或线来指示选择或边界 一般结合鼠标事件一同协作 继承于 QWidget import sys from PyQt5.QtWidgets import QApplication, QWidg ...
- Xcode 代码注释
/** * 生成二维码 * * @param data 二维码数据 * @param size 二维码大小 * @param color 二维码颜色 * @param backgroundColor ...
- Oracle的分页和MySQL的分页
Oracle的分页: select * from ( select rownum r,a from tabName where rownum <= 20 ) where r > 10 使用 ...