为什么2 Object有diff哈希码,但是2 String在Java中有相同的哈希码?

Zhi*_*ANG 2 java hash dictionary hashmap

class A{
    int a;
    A(){
        this.a = 100;
    }
}
//in main, we have:
A a = new A(), b = new A();
//and
String str0 = "123", str1 = "123";
Run Code Online (Sandbox Code Playgroud)

为什么str0和str1的哈希码是相同的,但不是a和b?

And*_*ira 6

因为你的班级没有String 覆盖 Object.hashCode().

这意味着String该类具有特定的实现hashCode(),将根据该String值计算散列.因此,对于具有相同值的两个字符串,哈希码将是相同的.

A例如,当您创建新类时,如果您不提供自己的实现,hashCode()则将使用类中的默认实现Object.默认实现只能保证如果哈希代码来自完全相同的实例,则它们将是相同的.

方法Objects.hash()(对于多个值)和Objects.hashCode()(对于单个值)使得hashCode()在您自己的类中实现更容易.例如:

class A{
    int a;

    A() {
        this.a = 100;
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(a);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果用于创建哈希值的属性值在某个时刻发生更改,则结果hashCode()可能也会更改.