【问题标题】:HashMap Object keyHashMap 对象键
【发布时间】:2013-03-18 01:00:54
【问题描述】:

在 Java 中,我有一个类:

public static class Key {

    int[] vector = null;

    private int hashcode = 0;

    Key (int[] key) {
        vector = new int[key.length];
        // here is the problem
        System.arraycopy(key, 0, vector, 0, key.length);
    }

    public int hashCode() { ... }

    public boolean equals(Object o) { ... }

}

作为HashMap<Key, int[]> map 中的一个键。在我做的代码中:

// value int[] array is filled before
map.put(new Key(new int[] {5, 7}), value);

但这会创建一个参数数组 {5, 7} 两次 - 第一次是在调用 Key 构造函数时,然后在该构造函数内部。

我不能使用HashMap<int[], int[]> map,因为不清楚hashCode 将用于int[]。所以我在Key 类中封装了int[] 键。

如何只创建一次参数数组(可以是不同大小的)?

我不喜欢这个解决方案:

map.put(new Key(5, 7), value);

// and rewrite the constructor
Key (int a1, int a2) {
    vector = new int[2];
    vector[0] = a1;
    vector[1] = a2;
}

因为通常参数数组可以有各种大小。

【问题讨论】:

  • 为什么不能将数组分配给向量成员?像这样 Key(int[] keys) { this.vector = keys;解决方案的缺点是可以从这个类之外修改键值。

标签: java arrays hashmap key


【解决方案1】:

如何只创建一次参数数组(可以是不同大小的)?

不幸的是,您不能这样做,因为没有办法使内置 Java 数组不可变。如果可以制作不可变数组,则可以使用以下方法:

Key (int[] key) {
    // Do not do this!!!
    vector = key;
}

虽然上述方法可以在完全合作的环境中工作,但恶意用户可以传递一个数组,让密钥计算哈希,然后更改数组元素以将错误引入您的代码。这就是为什么当你决定复制传入的数组时你是绝对正确的。

您可以更改函数以接受可变数量的参数,如下所示:

Key (int ... key) {
    vector = new int[key.length];
    System.arraycopy(key, 0, vector, 0, key.length);
}

这将使您可以隐式而不是显式地创建数组:

map.put(new Key(5, 7), value);

【讨论】:

    【解决方案2】:

    使用varargs作为参数并使用Arrays.copyOf()

    Key (int... key) {
        vector = Arrays.copyOf(key, key.length);
    }
    

    现在可以调用任意数量的if int参数(包括无参数)的构造函数,不会报错。

    【讨论】:

      【解决方案3】:

      由于arraycopy 被用于从一个对象到另一个对象的深度复制,在某些时候您需要创建两个对象,其中第二个对象的大小与参数数组的大小相同。所以vector = new int[key.length]; 看起来是正确的。

      顺便说一句,当我编译你的代码时,我得到一个错误,static 不是类的有效修饰符,只有 publicabstractfinal 是。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-04
        • 1970-01-01
        相关资源
        最近更新 更多