java中对equals hashcode的理解

若是要比较实际内存中的内容,那就要用equals方法,可是!!! java

若是是你本身定义的一个类,比较自定义类用equals和==是同样的,都是比较句柄地址,由于自定义的类是继承于object,而object中的equals就是用==来实现的,你能够看源码。 测试

那为何咱们用的String等等类型equals是比较实际内容呢,是由于String等经常使用类已经重写了object中的equals方法,让equals来比较实际内容。 this

在通常的应用中你不须要了解hashcode的用法,但当你用到hashmap,hashset等集合类时要注意下hashcode。 code

你 想经过一个object的key来拿hashmap的value,hashmap的工做方法是,经过你传入的object的hashcode在内存中找地 址,当找到这个地址后再经过equals方法来比较这个地址中的内容是否和你原来放进去的同样,同样就取出value。 继承

因此这里要匹配2部分,hashcode和equals 游戏

但 假如说你new一个object做为key去拿value是永远得不到结果的,由于每次new一个object,这个object的hashcode是永 远不一样的,因此咱们要重写hashcode,你能够令你的hashcode是object中的一个恒量,这样永远能够经过你的object的 hashcode来找到key的地址,而后你要重写你的equals方法,使内存中的内容也相等。。。 内存

下面我测试一个简单的例子 rem

import java.util.*;   
     public class Elins {   
        public static void main(String[] args){   
            Collection c =new HashSet();   
            c.add("Hellow");   
            c.add(new Name("天空游戏","www.tkyouxi.com"));   
               
            System.out.println(c.remove(new Name("天空游戏","www.tkyouxi.com")));   
            System.out.println(c);   
               
        }   
    }   
      
    class Name{   
        private String c;   
        private String d;   
        public Name(String a,String b){   
            this.c=a;   
            this.d=b;   
        }   
           
        public String toString(){   
            return c+":"+d;   
        }   
           
        public boolean equals(Object object){   
            return true;   
               
        }   
    //  public int hashCode(){  
    //      return c.hashCode();  
    //  }  
           
    }

当没有重写hashCode时的输出结果: get

false
[天空游戏:www.tkyouxi.com, Hellow] 源码

从 结果中能够看到c.remove(new Name("天空游戏","www.tkyouxi.com"))的反回结为fale;这个就是说明了c中的Name对像和要remove时new对像不 equals.如今咱们把30,31,32的注释去掉再来运行一下。下面是输出结果:

true [Hellow] 能够看到c里的Name对像被remove掉了。因此在当对像用在hashmap,hashset等集合类时要对equals与hashCode进行重写。

相关文章
相关标签/搜索