在Java世界中,所有的类都源自基类object,在object类中,有public native int hashCode(),该方法返
回一个hash值:Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对
象的字段等)映射成一个数值,这个数值称作为散列值。
1)自主选择一个类,说明它hashCode方法的设计理念和代码核心逻辑。
类hashmap
代码:
JDK8
public final int hashCode() {
return Objects.hashCode(key) ^ Objects.hashCode(value);
}
2) 举例说明。
我尝试从一下两个方面去分析为什么在JDK8中改进了hashmap的hashcode()方法。
1.从 return Objects.hashCode(key) ^ Objects.hashCode(value)这个公式来看,hashmap的hashcode()直接调用了object类的hashCode()方法,在前面说过,这个方法是native方法,通常来说,native方法比本地方法执行的要快,同时,采用"^"异或运算,使得运行速度再次提高。
2.Objects.hashCode()方法的参数,分别是hashmap的KEY和VALUE,这使得不同的<K,V>传入进来,hash碰撞的概率将大大的降低,所以此处用hashCode()方法来检验对象是否相等,就有了一点equals()方法的感觉了,不再像以前那样的生硬。
我感觉这个源码应该是JDK中最优美最质朴最高效又含义最丰富的代码了,对于新手来说,也能看懂,对于大神来说,能看到一层又一层的涵义,我经验浅薄,只能看到浮于表面的两点内容,希望自己能有一天可以写出这么“不可思议”的代码。
回到讨论本身,说到hashcode()方法必然离不开equals()方法。他们的作用其实一样,在Java里都是用来对比两个对象是否相等一致。但是重写的equal()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高,那么hashCode()既然效率这么高为什么还要equal()呢, 因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠,这也是所说的hash碰撞。只有把hashCode()和equals()结合起来使用,才能使得判断对象是否相等的准确性达到最高。