Java List.add()方法添加了一个可修改的对象

时间:2018-05-10 04:45:39

标签: java c++

我刚刚从C ++切换到Java。我正在将一段C ++代码转换为java。代码基本上将1-d向量添加到2-d,然后修改1-d向量,并且它不会改变C ++中的2-d向量。但是,当我在Java中实现它时,似乎修改1-d List将修改2-d List。任何人都可以给我一些术语,这样我就可以学到更多关于Java的知识,以及它在这方面与C ++的区别吗?谢谢。

C ++:

#include <iostream>
#include <vector>

using namespace std;

void printVec(vector<vector<int>> &vec) {
        for (int i = 0; i < vec.size(); ++i) {
                for (int j = 0; j < vec[i].size(); ++j) {
                        cout << vec[i][j] << "\t";
                }
                cout << endl;
        }
}

int main() {
        vector<int> a = {1,2,3};
        vector<vector<int>> b;
        b.push_back(a);

        printVec(b);

        a.pop_back();
        printVec(b);
}

输出:

1   2   3
1   2   3

Java:

import java.util.ArrayList;
import java.util.List;

public class Practice {
    public static void main(String[] args) {
        List<List<Integer>> list2 = new ArrayList<List<Integer>>();
        List<Integer> list = new ArrayList<>();
        list.add(2);
        list.add(3);
        list.add(4);
        list2.add(list);
        System.out.println(list2);

        list.remove(1);
        System.out.println(list2);
    }
}

输出:

  

[[2,3,4]] [[2,4]]

1 个答案:

答案 0 :(得分:1)

如果您不希望修改内部List,则只需在使用listlist2添加ArrayList时将其复制到list2.add(new ArrayList<>(list)); #39; s copy-constructor:

List

这是因为Java按值传递对象(浅拷贝),对可变引用的任何修改都将反映在您的[[2, 3, 4]] [[2, 3, 4]] 中,正如您在输出中看到的那样。但是,执行复制后,输出如下:

type="module"