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

标签 java c++

我最近刚从 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/

相关文章:

java - servlet 中的参数化构造函数

java - android - eclipse android launch 卡在 100

c++ - Windows.h 宏未定义

c++ - 什么是 "MFC Dialog Extension"? (Windows/C++新手-Linux背景)

c++ - 游戏实体类型分配

c++ - 精确到 Qstring 的数字

c++ - 如何正确删除 std::stack 中的指针?

Java 继承检查多个变量的值

Java JPanel,如何重叠它们(设置背景图像)

java - mp3transform 文档