我刚刚从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]]
答案 0 :(得分:1)
如果您不希望修改内部List
,则只需在使用list
&list2
添加ArrayList
时将其复制到list2.add(new ArrayList<>(list));
#39; s copy-constructor:
List
这是因为Java按值传递对象(浅拷贝),对可变引用的任何修改都将反映在您的[[2, 3, 4]]
[[2, 3, 4]]
中,正如您在输出中看到的那样。但是,执行复制后,输出如下:
type="module"