前言
本文是学习大佬文章之后,总结的一点个人理解,如果希望了解更深,请移步:[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有关。