【问题标题】:Method deepHashCode of Arrays class on two dimensional array二维数组上Arrays类的deepHashCode方法
【发布时间】:2013-10-13 12:51:51
【问题描述】:

我在理解Arrays.deepHashCodeint[][] 上的行为时遇到了一些问题。 我认为该程序很容易阅读。 A 和 B 具有与预期相同的哈希值。 D也与其他人不同。但由于某种原因,C 等于 A 和 B。C 实际上是 arrayA(和 arrayB)的转置,但这可能只是巧合,而不是返回相同哈希码的原因。

我不应该在int[][] 上使用这种方法吗?任何关于为int[][] 制作我自己的 hashCode 的好方法的建议,当且仅当每个子数组中的每个元素彼此相等时才返回相等的整数(相同的位置,相同的长度......就像深度克隆)

import java.util.Arrays;
public class Test{
    public static void main(String[] args){

            int[][] arrayA = new int[][]{
                {1,2,3},
                {4,5,6},
                {7,8,9}
            };

            int[][] arrayB = new int[][]{
                {1,2,3},
                {4,5,6},
                {7,8,9}
            };

            int[][] arrayC = new int[][]{
                {1,4,7},
                {2,5,8},
                {3,6,9}
            };

            int[][] arrayD = new int[][]{
                {1,5,9},
                {2,3,7},
                {4,6,8}
            };

            System.out.println("Deep hash codes:");
            System.out.println("Array A: " + Arrays.deepHashCode(arrayA));
            System.out.println("Array B: " + Arrays.deepHashCode(arrayB));
            System.out.println("Array C: " + Arrays.deepHashCode(arrayC));
            System.out.println("Array D: " + Arrays.deepHashCode(arrayD));
    }
}

输出:

Deep hash codes:

Array A: 30729379

Array B: 30729379

Array C: 30729379

Array D: 30760099

【问题讨论】:

    标签: java arrays hash


    【解决方案1】:

    任何关于为 int[][] 制作我自己的 hashCode 的好方法的建议,当且仅当每个子数组中的每个元素彼此相等时才返回相等的整数(相同的位置,相同的长度......就像深度克隆)

    这是不可能的。

    只有这么多不同的整数。你的整数数组有更多的组合。所以会有碰撞。

    hashCode 所能做的只是保证相反:如果两个数组有不同的 hashCode,它们就不同。

    【讨论】:

    • 转置后的数组是否具有相同的hashCode,可以查看Arrays#deepHashCode中计算hashCode的公式,在Javadocs中有详细说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 2014-05-23
    • 2017-01-26
    • 2017-04-22
    相关资源
    最近更新 更多