更多问答 >>
-
2019-09-09 00:19
-
2019-09-11 00:24
-
每日一问 gradle项目构建,需要经历哪些核心task,整个构建流程哪些我们可以干涉?
2019-09-15 23:29 -
2019-09-15 23:30
-
2019-09-17 22:41
-
2019-09-01 23:16
-
每日一问 Parcelable 为什么效率高于 Serializable ?
2019-08-26 00:02 -
每日一问 今天聊一下Gradle 相关,BuildConfig这个类是如何生成的?
2019-08-20 23:27 -
2019-08-18 21:42
-
每日一问 Android 有哪些 位运算 的例子很值得借鉴?
2019-08-13 21:56
1.equals 相同,hashcode 一定相同
2.hashcode 相同,equals 不一定相同3.HashMap、HashTable中配合。HashMap中的put方法就是先查看hashcode值,如果存在hashcode值就调用equals看元素是否存在,存在就更新,不存在就插入该新值,在插入大量非重复的数据时,可以有效的减少equals的调用,从而提高效率。a.按照java的设计思路,如果两个对象equals返回true,那么hashcode一定是相同的,反之则不一定。因为equals是反应两个对象的各属性是否相同,而hashcode是给出计算hash值的一个算法,在Java上hashcode是int值,其取值有限,所以对于两个对象,一定存在他们的属性不同而hashcode相同,甚至这两个对象可以属于完全不同的类;
b.但是equals和hashcode是两个Object的方法,我们当然可以通过重写这两个方法从而使存在两个对象equals返回false,而hashcode相同(比如equals直接返回false,hashcode直接返回0),但是这与java设计这两个方法的初衷相违背了。
c.equals的使用场景是来判断两个对象各个字段是否相同,而hashcode是用于使用hash表的时候计算hash值的辅助(在hashmap里hash值就是通过hashcode计算得来的),hashmap查询的步骤就是先通过hashcode计算出hash值,然后就知道应该在哪一个链表里面查询,在通过equals来查询到具体的key。也就是说对于hashmap,一个key对象的hashcode决定了它应该被放在hashmap里的哪一个链表里面(还与当前hash表的容量有关,因为计算hash值的时候使用了容量的,((n - 1) & hash)才是hash表的hash值。),而equals方法决定了两个key对象在hashmap看来是否是同一个对象。
d.也就是说我们如果想实现两个属性不同的对象在hashmap里面不能能同时存在,就重写equals方法,如果想要根据自己的需求防止hash碰撞,就重写hashcode方法。
https://www.jianshu.com/p/95907802e10b
小缘在哪?
关于第一点:重写equals方法不重写hashcode的情况下,equals相等hashCode并不一定相等。
1.equals 相同,hashcode 一定相同
2.hashcode 相同,equals 不一定相同3.一般在解决hash冲突的时候配合使用。HashMap中的解决hash冲突的原理就是这个,在进行put的时候就是先查看hashcode(并不是指对象的的hashcode,而是对key进行了一个hash映射)值,如果存在hashcode值就调用equals看元素是否存在,存在就更新,不存在就插入该新值,在插入大量非重复的数据时,可以有效的减少equals的调用,从而提高效率。刚才的回答,第一段注释是 Object 的 equals() 方法的,写错了。。
equals相同hashcode一定相同,hascode相同equals不一定相同!问题3 不了解