hashcode

作者: aliusa | 来源:发表于2018-02-24 18:05 被阅读0次

    hashcode的定义

    hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值 

    public int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。

    比如:

    Integer的hashcode是value

    public int hashCode() {

    return value;

    }

    String的hashcode是各个字符的特殊和

    public int hashCode() {

    int hash =hashCode;

    if (hash ==0) {

    if (count ==0) {

    return 0;

    }

    for (int i =0; i

    hash =31 * hash + charAt(i);

    }

    hashCode = hash;

    }

    return hash;

    }

    AbsractList的hashcode是集合内元素的hashcode特殊和

    public int hashCode() {

    int result =1;

    Iterator it = iterator();

    while (it.hasNext()) {

    Object object = it.next();

    result = (31 * result) + (object ==null ?0 : object.hashCode());

    }

    return result;

    }

    自定义类的hashcode可以是某些属性的hashcode特殊和

    public class RID

    private String id;

    public int hashCode() {

          return id.hashCode();

      }

    hashcode的规定

    一致性

    在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行hashcode比较时所用的信息没有被修改。

    equals

    如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果,注:这里说的equals(Object) 方法是指Object类中未被子类重写过的equals方法。

    如果两个hashCode()返回的结果相等,则两个对象的equals方法不一定相等。

    附加

    如果根据equals(java.lang.Object)方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

    举例子

    把两个相等的对象(equals)作为key放入hashmap中,结果存入了两个值

    import java.util.HashMap;  

    public class HashTest {  

    public static void main(String...args) {  

    MyBean a =new MyBean();  

    a.x =1;  

    a.s ="xyz";  

    MyBean b =new MyBean();  

    b.x =1;  

    b.s ="xyz";  

    HashMap map =new HashMap();  

    map.put(a,"a");  

    map.put(b,"b");  

    System.out.println("a equals b:"+a.equals(b));  

    System.out.println("map size:"+map.size());  

    System.out.println("a:"+map.get(a));  

    System.out.println("b:"+map.get(b));  

        }  

    }  

    class MyBean {  

    int x;  

        String s;  

    @Override  

    public boolean equals(Object obj) {       

    if(this == obj) return true;  

    if(!(obj instanceof MyBean)) return false;  

    if(((MyBean)obj).x == x) return true;  

    return false;  

        }  

    }  

    结果如下:

    a equals b:true

    map size:2

    a:a

    b:b

    这是因为自定义的类没有重写hashcode,而把对象作为key存入hashmap时,他们两者之间的hashcode值是不一致的,有两个key.

    如果重写hashcode也使他们相等的话,就只会存入一个值了

    class MyBean {  

    int x;  

        String s;  

    @Override  

    public boolean equals(Object obj) {       

    if(this == obj) return true;  

    if(!(obj instanceof MyBean)) return false;  

    if(((MyBean)obj).x == x) return true;  

    return false;  

        }  

    @Override  

    public int hashCode() {  

    return (s!=null?s.hashCode():1)*31+x;  

        }  

    }  

    结果如下:

    a equals b:true

    map size:1

    a:b

    b:b

    这样才保证了相等的对象在hash集合中也相等。计算hashcode的时候,一般使用关键的属性的hashcode值。计算hashcode的属性较多则计算复杂,降低了效率,若较少的属性计算,则重复的hashcode较多,同样降低性能,写一个好的hashcode方法,还比较难。

    所以,我们重写equals的时候,一定要重写hashcode方法。

    相关文章

      网友评论

          本文标题:hashcode

          本文链接:https://www.haomeiwen.com/subject/xwauzxtx.html