gpt4 book ai didi

java - java的list add方法按值传递问题

转载 作者:行者123 更新时间:2023-12-01 07:34:19 24 4
gpt4 key购买 nike

ArrayList<ArrayList<String>> list1 = new ArrayList<ArrayList<String>>();
ArrayList<String> list2 = new ArrayList<String>();

list2.add("foo");
System.out.println(list2); //[foo]
list1.add(list2);
System.out.println(list1); //[[foo]]
list2.set(0, "bar");
System.out.println(list2); //[bar]
System.out.println(list1); //[[bar]]

上面的代码显示了 2 个列表。当我将 list2 (包含 foo)添加到 list1 时,它们现在都包含 foo。但是当我将 list2 修改为 bar 时,list1 也会改变。我一直认为 add 方法只会将 list2 的副本提供给 list1,而我对 list2 所做的操作不会改变 列表1

如何才能将 list2 添加到 list1 但允许将来自由修改 list2,以便 list1 不会再受到影响吗?

最佳答案

在 Java 中,引用是按值传递的,而不是引用的对象。这意味着 list2.add(list1); 无法更改引用 list1,但它需要对同一对象的引用,并且如果您进行更改,它是可见的。

你应该这样写

List<List<String>> list1 = new ArrayList<List<String>>();
List<String> list2 = new ArrayList<String>();

list2.add("foo");
System.out.println(list2); //[foo]
list1.add(new ArrayList<String>(list2)); // take a copy of the list.
System.out.println(list1); //[[foo]]
list2.set(0, "bar");
System.out.println(list2); //[bar]
System.out.println(list1); //[[foo]]

list1.add(list2); 
list2 = new ArrayList<String>();
list2.add("bar");
System.out.println(list2); //[bar]
System.out.println(list1); //[[foo]]

My example above is simple but my actual problem is buried in nested loops and such.

List<List<String>> list1 = new ArrayList<List<String>>();

for(some loop) {
List<String> list2 = new ArrayList<String>();
// populate list2, can be smaller than the previous list2 !!
list1.add(list2);
}

关于java - java的list add方法按值传递问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14082786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com