Java基础(二) hashCode() 和 equals() 的联系


前言

本文是学习大佬文章之后,总结的一点个人理解,如果希望了解更深,请移步:[Java hashCode() 和 equals()的若干问题解答](https://www.cnblogs.com/skywang12345/p/3324958.html) ,每个问题都对应有源代码分析,对于全面理解很有帮助!

一、equals()作用是什么?

  • equals()是Object.java类中的方法,用来比较对象的地址是否相等,返回boolean类型结果。

  • 通常没有被重写的情况下,equals()方法源码里面就是用的’==’,所以效果等同

二、equals() 与 == 的区别是什么?

  • 针对Object类,是没有区别的;
  • 针对自己写的类,如果没有重写equals(),是与Object中情况一样的;

例如:String类,重写了equals(),让字符串内每个字符相等,才为true;


三、hashCode() 的作用是什么?

  • 得到int型的一个哈希码(散列值)
  • 只有在创建‘该类的散列表’时才有用,用来确定散列表索引(key)

Java集合中本质是散列表的类,HashMap,Hashtable,HashSet。

四、hashCode() 和 equals() 之间有什么联系?

前面提到,hashcode()只有在 用该类创建散列表时才有用;
所以,这个问题只针对这个情况下:

以Set为例,若重写equals(),不重写hashcode()。
Set中增加对象,通过哈希码,找索引地方,通过equals()判断是否需要插入,true则不插入;

摘取大佬的部分代码,展示只重写equals(),不重写hashcode()会出现的问题
Person p1 = new Person("eee", 100);
Person p2 = new Person("eee", 100);
HashSet set = new HashSet();
set.add(p1);
set.add(p2);

运行结果(显然有问题):
p1 hash:1169863946; p2 hash:1690552137
set:[(eee, 100), (eee, 100)]

看不懂这块的话,可能需要这些扩展知识:

  • Object类中的hashcode(),是根据对象内存地址,当前线程等计算得到的散列码;
  • Object类中的equals(),是return this==obj,比较的地址;
  • Set中不允许重复值;
  • Set.add底层使用的map.put,然后put的实现,跟hash,key,value有关。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值