При выполнении addAll для другого массива, оба массива ссылаются на одни и те же элементы - PullRequest
0 голосов
/ 14 мая 2018

Когда я добавляю все содержимое ArrayList к другому ArrayList, другой ArrayList содержит ссылки на элементы первого ArrayList.Следовательно, когда я изменяю элемент в одном из List s, соответствующий элемент в другом 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, но возникли проблемы с совместимостью.Любая помощь будет оценена.

1 Ответ

0 голосов
/ 14 мая 2018

Это явно означает, что addall назначает ссылки на новый список.

Это верно.

Я хочу знать лучший способ избежать ссылок и создатьмассив копий.

Не использовать addAll.Выполните итерацию по вводу List и создайте копию каждого элемента этого List.

Например, используя Java 8 Stream s и используя преимущества существующего конструктора копирования 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...