所有类默认继承Object类 先看一下Object源码
- package java.lang;
- public class Object {
- //默认调用本地的hashcode()方法 根据内存地址生成hash值 避免不了哈希冲突
- public native int hashCode();
- //默认调用的equals方法比较的是'=='比较
- //基本类型比较的是两者的值是否相同 而引用类型比较两者的是引用地址(对象)是否相同
- public boolean equals(Object obj) {
- return (this == obj);
- }
- }
复制代码结论
- equals()返回结果为true hashCode()一定相同
- '=='结果为true hashCode()一定相同
- '=='结果为false hashCode()有可能相同(哈希冲突)
hashCode()重写规范就是保证equals()相同的两个对象拥有相同的哈希值
回到刚刚哪个问题 为什么重写equals还要重写hashCode()?- public class per {
- private String name;
- private int age;
- public per(String name, int age) {
- this.name = name;
- this.age = age;
- }
- public boolean equals(Object o){
- if (this==o)return true;
- if (o==null||o.getClass()!=this.getClass())return false;
- per o1 = (per) o;
- return o1.name==name&&o1.name!=null&&o1.name.equals(this.name)&&age=o1.age;
- }
- public int hashCode(){
- return Objects.hash(name,age);
- }
- /*
- 这是Object类中的规范如果不同时重写将会导致很多类库出现业务不一致!
- 例如HashMap无法保证key值'唯一性'
- 下面测试代码p1和p2虽然地址不同 但是业务上看内容是相同的
- 所以应该只用一个key表示 但是不重写将无法正确插入!
- */
- }
- class Example{
- public static void main(String[] args) {
- per p1 = new per("张三", 18);
- per p2 = new per("张三", 18);
- HashMap<per,Integer> map = new HashMap<>();
- map.put(p1,1);
- map.put(p2,2); //具体原理可以看put(k,v)源码!
- }
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |