Несколько быстрых советов:
- Рассмотрим следующее соглашение о присвоении имен . Имена переменных начинаются со строчной буквы.
- Effective Java 2nd Edition, Item 65: Не игнорируйте исключения
- Effective Java 2nd Edition, Item 52: Ссылка на объекты по их интерфейсам
Сказав это, вы можете add
на ArrayList
так же, как вы add
на ЛЮБОЙ List
: вы можете add(E)
одного элемента или addAll
всего Collection<? extends E>
до конца списка. Существуют также перегрузки, которые принимают индекс, если вы хотите добавить элемент (ы) в более конкретное место.
О псевдонимах
Всегда помните, что объекты являются ссылочными типами, и ссылки могут быть псевдонимами. Если вы не понимаете, что это значит, некоторые виды поведения могут вас удивить.
Этот фрагмент показывает пример:
- Создание
List
из 3 AtomicReference
экземпляров, которые все ссылаются на один и тот же AtomicInteger
.
- Когда
AtomicInteger
увеличивается, все AtomicReference
видят этот эффект
- Один
AtomicReference
затем устанавливается для ссылки на секунду AtomicInteger
(В этом примере нет ничего конкретного о параллелизме)
import java.util.concurrent.atomic.*;
//...
List<AtomicReference<AtomicInteger>> refs =
new ArrayList<AtomicReference<AtomicInteger>>();
AtomicInteger counter = new AtomicInteger();
for (int i = 0; i < 3; i++) {
refs.add(new AtomicReference<AtomicInteger>(counter));
}
// we now have 3 AtomicReference,
// but only 1 AtomicInteger
System.out.println(refs); // [0, 0, 0]
counter.incrementAndGet();
System.out.println(refs); // [1, 1, 1]
refs.get(1).set(new AtomicInteger(9));
System.out.println(refs); // [1, 9, 1]
// we still have only 3 AtomicReference,
// but we've also created a second AtomicInteger
counter.incrementAndGet();
System.out.println(refs); // [2, 9, 2]
Обратите внимание, что хотя new AtomicReference
использовалось для List.add
каждый раз (то есть всего создается 3 различных объекта AtomicReference
), они все еще ссылались на один и тот же AtomicInteger
. Этот тип псевдонимов может быть источником вашей проблемы.