我网上找了许多这个问题的说法,大家都是争论不休,所以我就只有写写自己的理解请大佬来更正啦!
个人理解:
查找的角度:
需求:希望能用值相同的两个对象,在HashMap内作为键,找到相应的值;
查找方法:先通过键的hash码,找到对应的链表;再通过equals方法比较,找到对应的值;
HashMap这种查找方式的原因:高效性。如果统一用重写后的equals比较,需要比较每个对象内部属性,慢;而hash码是一个数字,能快速先找到少量的需要比较的值,然后再用重写后的equals比较,快;
如果不重写hashcode:找不到键对应的链表;
放入的角度:
需求:希望放入值相同的对象时覆盖前一个对象;
放入方法(想象中):先通过hash码,找到对应的链表;通过equals方法逐一比较链表内的对象,没有返回true的对象,存入;有返回true的对象,覆盖;
如果不重写hashcode:不同对象的hash码不同,会将我们认为的相同对象看成不同对象;都存入不同链表内;根本就进行不到equals方法;
set和map要通过这两个方法判断key是否重复
– chen8888 2年前