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 ...
随机推荐
- pL/Sql插入语句时报错,对表空间没有权限 对表空间 'USERS' 无权限
进入dba为其授予权限:sqlplus sys/admin as sysdba; 为用户授予权限即可 grant unlimited tablespace to username;
- 33. Search in Rotated Sorted Array (JAVA)
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- UIDynamic物理引擎
iOS开发拓展篇—UIDynamic(简单介绍) 一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟 ...
- EFL - Championship
Swansea City Charlton AthleticBristol CityLeeds UnitedPreston North EndWest Bromwich AlbionQue ...
- 034-openstack中虚拟机启动后主机名设置问题
openstack中虚拟机启动后主机名设置问题,在centos7中设置hostname后怎么都是原来的hostname,根本无效. 方法一: 在centos7中除了修改hosts文件和network文 ...
- css实现div内凹角样式
平常的开发中我们一般使用到圆角都是外凸的,即border-radius属性.而如果有内凹角的情况,我们一般的考虑实现方法有2种.一种是直接使用背景图片,一种是使用css. 用到的属性则是backgro ...
- bzoj5090 [Lydsy1711月赛]组题 分数规划
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5090 题解 令 \(s_i\) 表示 \(a_i\) 的前缀和. 那么平均难度系数就是 \[ ...
- 如何在vue中引入图片?
当我们在Vue.js项目中引用图片时,关于图片路径有以下几种情形: 使用一. 我们在data里面定义好图片路径 imgUrl:'../assets/logo.png' 然后,在template模板里面 ...
- BZOJ1896 Equations 线性规划+半平面交+三分
题意简述 给你\(3\)个数组\(a_i\),\(b_i\)和\(c_i\),让你维护一个数组\(x_i\),共\(m\)组询问,每次给定两个数\(s\),\(t\),使得 \[ \sum_i a_i ...
- 【hackerrank】Placements
题目如下: You are given three tables: Students, Friends and Packages. Students contains two columns: ID ...