if (e.hash == hash && ((k = e.key) == key||key.equals(k))) {
}
代码详解:
注意: ==只比较地址值,地址值跟哈希值没有关系!
哈希值(哈希码值) 指的是通过hashCode()方法获取的值,跟地址值没有关系。
只不过默认的hashCode()方法内部得到的结果是通过地址值生成的,如果我们重写了就按照我们重写的方式生成哈希值!
1、第一步通过比较hashCode的值
目的:如果两个对象的hashCode的值不相同,那么他们肯定不是同一个对象,
所以不再需要比较后面的内容,直接添加该元素即可
2、那么为什么需要后续的比较
原因:因为如果两个对象的内容不同,hashCode的值还是有可能相同的。
举例:几个哈希值都是8的不同字符串
'GA8Mfaaa', 'e4R5Blaa', 'Y92RLlaa', 'sCvEytaa', 'ydDspvaa',
'ofLCCCaa', 'uemC0Daa', 'CbgFKKaa', 'd0XRbNaa', 'hUzU9Saa'
3、为什么需要(k = e.key) == key这一步的比较?
原因:提高效率,因为如果这个时候比较的是同一个对象,hashCode的值肯定相同。
那么如果直接走equals()方法进行比较,代码较多,而同一个对象==比较,结果肯定为true,
就不用再走equals()方法了。
4、为什么需要key.equals(k)这一步的比较?
如果对象的hashCode值相同,但内容相同不同(查看上面的举例),就不能够被添加,所以需要这一个进行内容的比较!
那么既然能够用equals解决问题,为什么还需要hashCode值的比较?
原因:使用hashCode()的比较要比直接走equals快,虽然如果两个对象时相同的这样显的有点麻烦,
但是其实大家要明白我们存储的大多数对象肯定是不同的! |
|