博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java基础之equals和hashCode方法
阅读量:6546 次
发布时间:2019-06-24

本文共 1919 字,大约阅读时间需要 6 分钟。

HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键。 那么Java虚拟机是如何判断HashSet中相同对象、HashMap中相同键的呢?

首先说明一下JDK对equals(Object obj)和hashcode()这两个方法的定义和规范: 在Java中任何一个对象都具备equals(Object obj)和hashcode()这两个方法,因为他们是在Object类中定义的。 equals(Object obj)方法用来判断两个对象是否"相同",如果"相同"则返回true,否则返回false。 hashcode()方法返回一个int数,在Object类中的默认实现是"将该对象的内部地址转换成一个整数返回"。

规范1:若重写equals(Object obj)方法,有必要重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。

规范2:如果equals(Object obj)返回false,即两个对象"不相同",并不要求对这两个对象调用hashcode()方法得到两个不相同的数。

根据这两个规范,可以得到如下推论:

1、如果两个对象equals,Java虚拟机会认为他们的hashcode一定相等。
2、如果两个对象不equals,他们的hashcode有可能相等。
3、如果两个对象hashcode相等,他们不一定equals。
4、如果两个对象hashcode不相等,他们一定不equals。

代码测试

public class Father {        public String name;        public int age;        public Father(String name, int age) {        this.name = name;        this.age = age;    }        @Override       public boolean equals(Object obj) {           System.out.println("判断equals");           return true;       }          @Override       public int hashCode() {           System.out.println("判断hashcode");           return 1;       }}

测试类

public class Test {    public static void main(String[] args) {        Map
map = new HashMap
(); map.put(new Father("fei", 23), new Object()); map.put(new Father("qiang", 22), new Object()); System.out.println(map.size()); }}

结果:

判断hashcode
判断hashcode
判断equals
1

分析上面结果

当第一次map.put()的时候,Java虚拟机就会判断这个map里面有没有和现在添加的Object对象相同的键,判断方法:调用Father对象的hashcode()方法,判断map中当前是不是存在和Father对象相同的HashCode。显然,这时候没有相同的,因为这个map中都还没有东西。

当第二次map.put()的时候,Java虚拟机再次判断,这时候发现了map中有两个相同的hashcode(法永远都返回1),所以有必要调用equals(Object obj)方法进行判断了。因为equeal永远返回true,所以Java虚拟机认为这是两个相同的对象,或者说是键,所以map的size为1,键相同,值替换。

费哥总结

在Java规范下:

equals方法返回值true,那么hashCode方法返回的int值一定相等。
hashCode方法返回的int值不相等,equals方法返回值一定为false。

转载于:https://www.cnblogs.com/feiqiangsheng/p/11106792.html

你可能感兴趣的文章
RACCommand 粗解
查看>>
swift 快速创建一些基本控件
查看>>
c#登陆邮箱
查看>>
【python】入门第一篇
查看>>
1682: [Usaco2005 Mar]Out of Hay 干草危机
查看>>
supersr--NSURLConnection iOS2.0苹果原生请求
查看>>
【51NOD-0】1089 最长回文子串 V2(Manacher算法)
查看>>
【CodeForces】582 C. Superior Periodic Subarrays
查看>>
常用排序算法:希尔排序
查看>>
Swing编程基础 之五
查看>>
HTML简介
查看>>
python--多任务线程
查看>>
Go语言学习笔记-通道
查看>>
构造函数,重载,静态方法和静态成员
查看>>
Vue 实现前进刷新,后退不刷新的效果
查看>>
xss和csrf攻击的那些事儿
查看>>
SpringCloud学习之路(四) - 服务消费者(Feign)
查看>>
RxJS Observables vs Promise 之简单对比
查看>>
2017年软件工程第十二次作业-PSP总结报告
查看>>
HTTP协议头注射漏洞实例
查看>>