黑马程序员技术交流社区

标题: if (e.hash == hash && ((k = e.key) == key||key.equals(k))) { } [打印本页]

作者: Sparky    时间: 2015-7-23 22:37
标题: if (e.hash == hash && ((k = e.key) == key||key.equals(k))) { }
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快,虽然如果两个对象时相同的这样显的有点麻烦,
                但是其实大家要明白我们存储的大多数对象肯定是不同的!






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2