HashMap中hashCode和equals问题

在HashMap中的put操作中,有一个判断:若“该key”对应的键值对已经存在,则用新的value取代旧的value。然后退出!源码为:
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
按我的理解,如果要判断key是否相等,直接用(k = e.key) == key || key.equals(k)不就行了吗?为何还有判断hash是否相等?

个人这没什么意义,关键是先有的HashMap,那也就只能根据它的规则。
因为hashcode和equals是可以重写的,所以hash值一样,key值不一定一样。同理,key的值一样,不一定是同一个对象。
我觉得是看不同场景需要,多一种选择。

用hash可以提高运算效率。因为用hash,直接查找就可以了,而用equals,需要两两比较运算。
hash不同,肯定equals返回否。

如果hash不想等,它可能希望进行别的处理。你可以看看它else是否有做什么事情。

首先,明确java在判断两个对象相等时有两种方法:1,equals();2,hashCode()
两者的关系:1,如果两个对象equals,那么他们hashCode一定相同;
2,如果两个对象不equals,那么他们hashCode也不确定;
3,如果两个对象hashCode相同,那么他们不一定equals;
4,如果两个对象hashCode不同,那么他们一定不equals。(可以参考Object类和String类里的两个方法,看看API文档)
而HashMap比较键值时,为了提高效率(主要应对大数据量),会采用上面的第3,4条规则,先比较HashCode