A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴豪 中级黑马   /  2015-8-13 23:00  /  346 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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快,虽然如果两个对象时相同的这样显的有点麻烦,
                但是其实大家要明白我们存储的大多数对象肯定是不同的!

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马