我最近刚从 C++ 转向 Java。我正在将一段 C++ 代码转换为 java。这些代码基本上是将一维 vector 添加到二维 vector ,然后修改一维 vector ,并且它不会更改 C++ 中的二维 vector 。但是,当我用 Java 实现它时,似乎修改一维列表将修改二维列表。谁能给我一些术语,以便我可以更多地了解 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]]
最佳答案
如果你不想修改内部的List
,你只需要在将list
添加到list2
时先复制它使用 ArrayList
的复制构造函数:
list2.add(new ArrayList<>(list));
发生这种情况是因为 Java 按值传递对象(浅拷贝),并且对可变引用的任何修改都将反射(reflect)在您的 List
中,正如您在输出中看到的那样。但是,执行复制后,输出如下:
[[2, 3, 4]]
[[2, 3, 4]]
关于Java List.add() 方法添加一个可修改的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50265634/