Java 中的 HashMap 深拷贝

Deep Copy of HashMap in Java

我在制作 HashMap 的深层副本时遇到困难。 我从 尝试了下面的代码,但是 List.copyOf 处的列表给我一个错误(无法解析符号 'List'),我不确定用什么替换它。如果有任何其他方法来制作HashMap的深拷贝,我很想听听。

private HashMap<Character, ArrayList<int[]>> board;

public Vertex(HashMap<Character, ArrayList<int[]>> inputboard) {
        board = new HashMap<>();
        this.board = copy(inputboard);
}

public HashMap<Character, ArrayList<int[]>> copy (HashMap<Character, ArrayList<int[]>> original) {  
        HashMap<Character, ArrayList<int[]>> copy = original.entrySet().stream()
                .collect(Collectors.toMap(e -> e.getKey(), e -> List.copyOf(e.getValue())));
        return copy;
}

在我使用上面的代码之前,我也从尝试过这个但是它没有进行深度复制

private HashMap<Character, ArrayList<int[]>> board;

public Vertex(HashMap<Character, ArrayList<int[]>> inputboard) {
        board = new HashMap<>();
        this.board = copy(inputboard);
}

public HashMap<Character, ArrayList<int[]>> copy (HashMap<Character, ArrayList<int[]>> original) {
       HashMap<Character, ArrayList<int[]>> copy = new HashMap<>();
       for (Map.Entry<Character, ArrayList<int[]>> entry : original.entrySet()) {
            copy.put(entry.getKey(), new ArrayList<>(entry.getValue()));
       }
       return copy;
}

您展示的两种方式都没有复制 int[],即没有复制到您想要的深度。

第一种方法实际上 return 是 Map<Character, List<int[]>> 而不是您想要的 HashMap<Character, ArrayList<int[]>>。我建议您 program to interfaces 并将您的方法更改为 return a Map<Character, List<int[]>>,然后您可以使用这样的流:

public Map<Character, List<int[]>> copy (HashMap<Character, ArrayList<int[]>> original) {
    Map<Character, List<int[]>> copy = original.entrySet().stream()
        .collect(Collectors.toMap(
            Entry::getKey,
            e -> e.getValue().stream().map(x -> Arrays.copyOf(x, x.length)).collect(Collectors.toList())
        ));
    return copy;
}

如果您真的不想更改 return 类型,则必须传递更多参数来指定您想要的具体类型:

public HashMap<Character, ArrayList<int[]>> copy (HashMap<Character, ArrayList<int[]>> original) {
    HashMap<Character, ArrayList<int[]>> copy = original.entrySet().stream()
        .collect(Collectors.toMap(
            Entry::getKey,
            e -> e.getValue().stream().map(x -> Arrays.copyOf(x, x.length)).collect(Collectors.toCollection(ArrayList::new)),
            (x, y) -> x,
            HashMap::new
        ));
    return copy;
}

否则,您可以使用传统的 for 循环:

public HashMap<Character, ArrayList<int[]>> copy (HashMap<Character, ArrayList<int[]>> original) {
    HashMap<Character, ArrayList<int[]>> copy = new HashMap<>();
    for (Map.Entry<Character, ArrayList<int[]>> entry : original.entrySet()) {
        ArrayList<int[]> listCopy = new ArrayList<>();
        for (int[] array: entry.getValue()) {
            listCopy.add(Arrays.copyOf(array, array.length));
        }
        copy.put(entry.getKey(), listCopy);
    }
    return copy;
}

请注意,在所有三个代码片段中,我都使用 Arrays.copyOf 复制 int[]