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 ...
随机推荐
- Redis数据类型及基本命令
一.基础命令 提示:Redis不区分命令大小写 1.获得符合规则的键名列表 keys pattern //pattern支持glob风格通配符格式 2.判断一个键是否存在 exists key ...
- luogu P5331 [SNOI2019]通信
传送门 有匹配次数限制,求最小代价,这显然是个费用流的模型.每个点暴力和前面的点连匹配边,边数是\(n^2\)的. 然后发现可以转化成一个set,每次加入一个点,然后入点对set里面的出点连边.这个s ...
- 【React -- 9/100】 抽离顶部导航栏 - [组件复用]
今天写的页面中需要重复使用到顶部导航栏,所以把顶部导航栏抽离出来 考虑复用组件的健壮性,使用PropTypes校验,可以自定义一个click事件 JSX import React from " ...
- nginx 启动关闭
#检查语法 /application/nginx/sbin/nginx –t #平滑重启 /application/nginx/sbin/nginx –s reload #不间断服务重启,将 pid ...
- libevent cs
int evutil_make_listen_socket_reuseable(evutil_socket_t sock): 相当于执行以下操作 int one = 1; setsockopt(soc ...
- Manjaro系统和软件安装记录
Linux桌面环境 ArchLinux官方wiki manjaro官方wiki pacman官方wiki 从www.distrowatch.com可以查看Linux发行版排行榜,可以看到manjar ...
- Delphi-----接口请求,Get与Post
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- MySQL数据库1初识MySQL
目录 Mysql 一.数据库是什么? 二.为啥使用数据库?(*****) 三.数据库的分类(*****) 1.关系型数据库 2.非关系型数据库 3.关系型与非关系型区别: 四.数据库MySQL的架构 ...
- Java面试之集合框架篇(3)
21.ArrayList和Vector的区别 这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态 ...
- mysql 数据库必会题
Linux运维班MySQL必会面试题100道 (1)基础笔试命令考察 (要求:每两个同学一组,一个口头考,一个上机实战作答,每5个题为一组,完成后换位) 1.开启MySQL服务 2.检测端口是否运行 ...