提问人: 提问时间:9/27/2021 最后编辑:Matt Ke 更新时间:10/5/2021 访问量:395
Java ArrayList 独立副本
Java ArrayList independent copy
问:
我使用下面的方法制作了一个列表的副本,正如你所看到的输出,它们是独立的。我做错了什么吗?还是他们真的独立?因为我在互联网上做了一些研究,它告诉我这种方法应该通过引用传递(列表“a”和“copy”应该是依赖的)。
public static void main(String[] args) {
ArrayList<String> a = new ArrayList<>(Arrays.asList("X", "X"));
ArrayList<String> copy = new ArrayList<>(a);
copy.set(0, "B");
copy.remove(copy.size()-1);
System.out.println(a);
System.out.println(copy);
}
输出:
[X, X]
[B]
答:
0赞
zysaaa
9/27/2021
#1
是的,此方法应通过引用传递(列表“a”和“copy”应依赖)。但这两项操作并不能证明这一点。
copy.set(0, "B");
copy.remove(copy.size()-1);
查看以下代码是否有助于理解:
public static void main(String[] args) {
Process process = new Process(1);
Process process2 = new Process(2);
ArrayList<Process> a = new ArrayList<>(Arrays.asList(process, process2));
ArrayList<Process> copy = new ArrayList<>(a);
copy.get(0).id = 10;
// This proves that both ArrayLists maintain the same Process object at this point
// output:
// [Id:10, Id:2]
// [Id:10, Id:2]
System.out.println(a);
System.out.println(copy);
// copy.remove(copy.size() - 1) or copy.set(0, process3) doesn't affect another ArrayList
Process process3 = new Process(3);
process3.id = 100;
copy.set(0, process3);
copy.remove(copy.size() - 1);
// output:
// [Id:10, Id:2]
// [Id:100]
System.out.println(a);
System.out.println(copy);
}
static class Process {
public int id;
public Process(int id) {
this.id = id;
}
@Override
public String toString() {
return "Id:" + id;
}
}
1赞
Bohemian
9/27/2021
#2
构造一个列表,其中包含指定集合的元素,按照集合的迭代器返回这些元素的顺序。
修改一个列表对另一个列表没有影响,您的代码已确认这一点。
评论