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 ...
随机推荐
- 华为云搭建windows+wordpress+xampp
1.如何将本地文件上传至华为云ECS云服务器(Windows系统) 1.1 在本地电脑上,快捷键“WIN+R"打开“运行”中输入“mstsc”,点击确定 1.2 在“远程桌面连接”框点击“ ...
- JS中For循环中嵌套setTimeout()方法的执行顺序
在For循环中执行setTimeOut()方法的代码,执行顺序是怎样的呢? 代码如下 function time() { for(var i= 0;i<5;i++){ setTimeout(fu ...
- UIScrollView学习笔记
1.如何使用UIScrollView显示一张比屏幕大的图片 //创建滚动视图的对象 UIScrollView * sv = [[UIScrollView alloc]initWithFrame:CGR ...
- redHat 安装mono 错误
make[6]: * [do-install] Error 2 make[6]: Leaving directory /root/lindexi/mono-2.11.3/mcs/class/Syste ...
- 把excel中的数据导入到Oracle数据库中
从事工作以来,数据库一直使用oracle,却不知道excel导入oracle,今天看了一篇文章,分享给大家,希望对大家有用. https://jingyan.baidu.com/article/0f5 ...
- listalias - 列出用户和系统别名
总揽 listalias [ -s | -u ] [ 正则表达式] 描述 Listalias 按用户及系统别名每个输出一行.每行具有下列格式: <别名> <地址> (<注 ...
- 3.17内存,进程,rpm和yum,python编译安装
一.内存 前面说过内存有寄存器.高速缓存和内存条 但在实际情况中有些文件比较大,内存不足以读取其内容,并且大部分内容不是被立即使用,所以有了交换分区,即用硬盘空间临时存储相关部分,当作缓存,这部分就是 ...
- Java并发(具体实例)——几个例子
一步步优化页面渲染功能 本节将模拟一个简单的页面渲染功能,它的作用是将HTML页面绘 ...
- Linux shell 批量验证端口连通性
工作中会遇到验证到某某服务器端口是否连通,如果IP或端口多时,用shell还是很省时省力的,看下面的脚本: #!/bin/bash # #database check #set -o nounset ...
- 模块打包 webpack
1.模块打包工具 2.工作方式: 1)将存在依赖关系的模块按照特定规则合并为单个JS文件,一次全部加载进页面中 2)在页面初始时加载一个入口模块,其他模块异步的进行加载 3.优势: 1)支持AMD,C ...