2013-03-18 66 views
1

在Java中,我有一个类:HashMap对象键

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

因为通常一个参数阵列可以是各种尺寸。

+0

为什么你不能分配数组到矢量成员?像这个Key(int [] keys){this。vector = keys; }解决方案的缺点是可以从该类之外修改关键值。 – Delta 2013-03-18 01:28:52

回答

3

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

不幸的是,你不能这么做,因为没有办法使内置的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); 
1

使用varargs的参数和使用Arrays.copyOf()

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

现在,您可以拨打任何号码,如果int参数(包括无参数)构造函数,它不会导致错误。

1

由于arraycopy被用来从一个对象做一个深拷贝到另一个,在某些时候,你需要创建两个对象,其中第二个是尺寸参数数组一样。所以vector = new int[key.length];看起来是正确的。

顺便说一句,当我编译代码我得到一个错误static不是类有效修改,只有publicabstract,或final是。