迭代HashMap奇怪的行为

时间:2015-05-27 05:12:04

标签: java hashmap

我遇到一些奇怪的东西,我无法得到正在发生的事情。我正在创建一个HashMap,然后在一个循环上添加一些键值对。在循环中我在每次迭代时改变一个预先初始化的数组。所以我期望总是将不同的数组作为map中的值。这是代码:

int[] valueArray = new int[3];
int key = 0;
Map<Integer, int[]> map = new HashMap<>();
while (key < 5) {
    for (int i = 0; i < 3; i++) {
        valueArray[i] = key;
    }
    System.out.println(Arrays.toString(valueArray));
    map.put(key, valueArray);
    key++;
}
for (int i = 0; i < map.size(); i++) {
    System.out.println("Key: " + i + " Value: " + Arrays.toString(map.get(i)));
}

这是输出:

[0, 0, 0]
[1, 1, 1]
[2, 2, 2]
[3, 3, 3]
[4, 4, 4]
Key: 0 Value: [4, 4, 4]
Key: 1 Value: [4, 4, 4]
Key: 2 Value: [4, 4, 4]
Key: 3 Value: [4, 4, 4]
Key: 4 Value: [4, 4, 4]

1 个答案:

答案 0 :(得分:0)

您每次都使用相同的数组引用。使其工作在每次迭代时创建一个新的引用。像这样:

int key = 0;
Map<Integer, int[]> map = new HashMap<>();
while (key < 5) {
int[] valueArray = new int[3];
    for (int i = 0; i < 3; i++) {
        valueArray[i] = key;
    }
    System.out.println(Arrays.toString(valueArray));
    map.put(key, valueArray);
    key++;
}
for (int i = 0; i < map.size(); i++) {
    System.out.println("Key: " + i + " Value: " + Arrays.toString(map.get(i)));
}