gpt4 book ai didi

java - 在其他 arraylist 上执行 addAll 时,两个 arraylists 引用相同的元素

转载 作者:行者123 更新时间:2023-11-29 06:50:23 25 4
gpt4 key购买 nike

当我将一个 ArrayList 的所有内容添加到另一个 ArrayList 时,另一个 ArrayList 包含对第一个 元素的引用数组列表。因此,当我更改其中一个 List 中的元素时,另一个 List 中的相应元素也会更改。这显然意味着 addAll 将引用分配给新的 List

引用代码:

ArrayList<StringBuffer> a = new ArrayList<>();
a.add(new StringBuffer("1"));
a.add(new StringBuffer("2"));
a.add(new StringBuffer("3"));

ArrayList<StringBuffer> b = new ArrayList<>();
b.addAll(a);

System.out.println("Arralists" + " before: ");
System.out.println("A arraylist" + a.toString());
System.out.println("B arraylist" + b.toString() + "\n\n");

a.set(0, a.get(0).replace(0, 1, String.valueOf(4)));

System.out.println("Arralists after " + "updating a: ");
System.out.println("A arraylist" + a.toString());
System.out.println("B arraylist" + b.toString() + "\n\n");

对应日志:

Arralists before: 
A arraylist[1, 2, 3]
B arraylist[1, 2, 3]


Arralists after updating a:
A arraylist[4, 2, 3]
B arraylist[4, 2, 3]

我想知道避免引用和创建副本数组的最佳方法。

编辑

我想在 android 中执行此操作。 @Eran 建议用 Java8 回答,但随之而来的是兼容性问题。任何帮助将不胜感激。

最佳答案

This clearly means addall assigns references to the new list.

没错。

I want to know the best way to avoid references and create a copy array.

不要使用addAll。遍历输入 List 并创建该 List 的每个元素的副本。

例如,使用 Java 8 Stream 并利用现有的复制构造函数 StringBuffer(CharSequence seq):

List<StringBuffer> b = a.stream().map(StringBuffer::new).collect(Collectors.toList());

如果没有 Stream,您可以使用 for 循环:

List<StringBuffer> b = new ArrayList<>();
for (StringBuffer sb : a) {
b.add(new StringBuffer(sb));
}

关于java - 在其他 arraylist 上执行 addAll 时,两个 arraylists 引用相同的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50324352/

25 4 0