java 基础笔记--hashCode(),你好,为啥要重写

Posted 钟政123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 基础笔记--hashCode(),你好,为啥要重写相关的知识,希望对你有一定的参考价值。

   从学习java开始就知道,hashCode()方法是object类本身就有的方法,所有的类都继承了object,也就了hashCode()这个方法。

在学java的时候,就被告知在重写equals方法时,也要重写hashCode方法。当时没细想,以为这个是语法规定。

  后来了解到,这个确实java规定:

  hashcode相等的两个对象内容不一定相等。

  对象内容相等的两个对象hashcode一定相等!

 

  如果比较两个对象是否相等。比较两个对象的内容涉及的东西比较多,但是hashcode只是一个int数字,要比较还是不简单!性能上比equals快多了。在set,map等集合类中,代码中都是先利用hashcode判断key是否存在和重复。这也就是如果自定义类作为key时,要求要重写hashCode方法。

默认的hashcode的值是对象在内存中的地址。

随便提一下,String也是重写了hashCode方法的。

String类关键代码如下:

/**
     * Returns a hash code for this string. The hash code for a
     * {@code String} object is computed as
     * <blockquote><pre>
     * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
     * </pre></blockquote>
     * using {@code int} arithmetic, where {@code s[i]} is the
     * <i>i</i>th character of the string, {@code n} is the length of
     * the string, and {@code ^} indicates exponentiation.
     * (The hash value of the empty string is zero.)
     *
     * @return  a hash code value for this object.
     */
    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }
View Code

就是它了,根据内容来决定hashcode的值的。

测试代码如下:

public class Dog {
    private int age;
    private String name;
    public Dog(String name,int age){
        this.name=name;
        this.age=age;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    
}

 

public class Hash {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String a="abc";
        String b=new String("abc");
        String c=new String("abc");
        String d="abc";
        System.out.println(" a hashcode:"+a.hashCode()+"--"+(a==d));
        System.out.println(" b hashcode:"+b.hashCode()+"--"+(b==c));
        System.out.println("c hashcode:"+c.hashCode());
        System.out.println("d hashcode:" +d.hashCode());
        Dog dog1=new Dog("aa", 1);
        Dog dog2=new Dog("aa", 1);
        
        System.out.println(dog1.hashCode());
        System.out.println(dog2.hashCode());
        
    }

}

  运行结果(每次运行dog的hashcode的结果不一样。下图仅仅是参考):

至于equals的方法介绍参考

https://www.cnblogs.com/yxnchinahlj/archive/2010/09/27/1836556.html 

 

以上是关于java 基础笔记--hashCode(),你好,为啥要重写的主要内容,如果未能解决你的问题,请参考以下文章

Java:Effective java学习笔记之 覆盖equals时总要覆盖hashcode

java基础解析系列---equals==和hashcode方法

Java基础重写equals需要重写hashcode

笔记之_Java基础整理

Java基础:hashCode与equals个人学习记录

Java基础之hashCode方法具体解释