java - 为什么在Java中2个Object有不同的哈希码,但2个String有相同的哈希码?

标签 java dictionary hash 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";

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

最佳答案

因为String 覆盖 Object.hashCode()而你的类(class)没有。

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

当您创建一个新类时,A ,例如,如果您没有为 hashCode() 提供自己的实现它将使用类 Object 的默认实现。默认实现只能保证哈希码来自完全相同的实例时相同。

方法Objects.hash() (对于多个值)和 Objects.hashCode() (对于单个值)使其更容易实现 hashCode()在你自己的类里面。例如:

class A{
    int a;

    A() {
        this.a = 100;
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(a);
    }
}

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

关于java - 为什么在Java中2个Object有不同的哈希码,但2个String有相同的哈希码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29266138/

相关文章:

Java - 并发修改异常

java - 为什么当前目录不是目标\类?

c++ - 迭代 map

c++ - std::map 扩展初始值设定项列表是什么样的?

c# - 如何根据项目在树中的位置为树状数据结构编写哈希码?

java - 操作布局上的所有按钮

java - 管理同一台计算机上 Play 框架服务器的多个实例的 session 详细信息

python,存储重复条目的智能方法

node.js - 将 md5 哈希值添加到 mongo 集合

perl - 如何根据另一个哈希的键/值删除[子]哈希?