两个java对象哈希代码如何相似

两个java对象哈希代码如何相似,java,Java,在下面的代码中,我有两个字符串对象,它们都是不同的对象,但我得到了相似的哈希代码。这是怎么可能的 公共类ObjectHashCode{ public static void main(String...mj){ String str1 = new String("Aa"); String str2 = new String("BB"); System.out.println(str1.hashCode());//

在下面的代码中,我有两个字符串对象,它们都是不同的对象,但我得到了相似的哈希代码。这是怎么可能的

公共类ObjectHashCode{

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

            String str1 = new String("Aa");
            String str2 = new String("BB");

            System.out.println(str1.hashCode());//2112
            System.out.println(str2.hashCode());//2112
        }

}

您应该始终阅读有关方法输入和方法输出之间基本契约的文档。在这种情况下,文件说明(省略不相关的段落):

如果两个对象不相等,不要求 根据{@link java.lang.Object#equals(java.lang.Object)} 方法,然后对每个 两个对象必须产生不同的整数结果。但是, 程序员应该知道生成不同的整数结果 对于不相等的对象,可以提高哈希表的性能

至于为什么这些值是相同的,Java的好处是您可以随时查看源代码。这是如何为
String
的实例计算
hashCode

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;
}

注意:a'=65,'B'=66,'a'=97的数值

您应该始终阅读有关方法输入和方法输出之间基本契约的文档。在这种情况下,文件说明(省略不相关的段落):

如果两个对象不相等,不要求 根据{@link java.lang.Object#equals(java.lang.Object)} 方法,然后对每个 两个对象必须产生不同的整数结果。但是, 程序员应该知道生成不同的整数结果 对于不相等的对象,可以提高哈希表的性能

至于为什么这些值是相同的,Java的好处是您可以随时查看源代码。这是如何为
String
的实例计算
hashCode

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;
}

注意:a'=65,'B'=66,'a'=97的数值

有2^32个可能的唯一哈希代码。还有更多可能的字符串。因此,不同的字符串可以有相同的哈希代码。这就是他们所谓的“哈希冲突”,这也是哈希***有bucket或一些超复杂移位逻辑的原因之一。用于哈希值冲突或哈希值模冲突。有2^32个可能的唯一哈希代码。还有更多可能的字符串。因此,不同的字符串可以有相同的哈希代码。这就是他们所谓的“哈希冲突”,这也是哈希***有bucket或一些超复杂移位逻辑的原因之一。用于哈希值冲突或哈希值模冲突。