У меня есть файл, List<SomeBean>
который заполняется из веб-службы. Я хочу скопировать / клонировать содержимое этого списка в пустой список того же типа. Поиск в Google для копирования списка предложил мне использовать Collections.copy()
метод. Во всех примерах, которые я видел, список адресатов должен был содержать точное количество элементов для копирования.
Поскольку список, который я использую, заполняется через веб-службу и содержит сотни объектов, я не могу использовать описанный выше метод. Или я неправильно использую ?? !! В любом случае, чтобы заставить его работать, я попытался сделать что-то вроде этого, но все равно получил IndexOutOfBoundsException
.
List<SomeBean> wsList = app.allInOne(template);
List<SomeBean> wsListCopy=new ArrayList<SomeBean>(wsList.size());
Collections.copy(wsListCopy,wsList);
System.out.println(wsListCopy.size());
Я попытался использовать, wsListCopy=wsList.subList(0, wsList.size())
но ConcurrentAccessException
позже в коде получил. Удар и испытание. :)
В любом случае, мой вопрос прост: как я могу скопировать все содержимое моего списка в другой список? Конечно, не путем повторения.
источник
app.allInOne(template)
?ArrayList
?Ответы:
Просто используйте это:
Примечание: все еще не потокобезопасный, если вы изменяете
otherList
из другого потока, вы можете захотеть сделать этоotherList
(и дажеnewList
)CopyOnWriteArrayList
, например, - или использовать примитив блокировки, такой как ReentrantReadWriteLock, чтобы сериализовать доступ для чтения / записи к любым спискам одновременный доступ.источник
ConcurrentAccessException
.Это действительно хороший способ сделать это в Java 8:
Конечно, преимущество в том, что вы можете фильтровать и пропускать только часть списка.
например
источник
list
что изменяется во время работы коллектора, аConcurrentModificationException
выбрасывается..limit(list1.size() - 1)
Помните, что всякий раз, когда вы используете метод addAll () для копирования, содержимое обоих списков массивов (originalArrayList и copyArrayofList), ссылки на одни и те же объекты, будут добавлены в список, поэтому, если вы измените какой-либо из них, copyArrayofList также будет отражают то же изменение.
Если вам не нужен побочный эффект, вам нужно скопировать каждый элемент из originalArrayList в copyArrayofList, например, используя цикл for или while.
источник
Это означает, что вы изменяете список, пытаясь скопировать его, скорее всего, в другом потоке. Чтобы исправить это, вам нужно либо
используйте коллекцию, предназначенную для одновременного доступа.
заблокируйте коллекцию соответствующим образом, чтобы вы могли выполнить итерацию по ней (или позволить вам вызвать метод, который сделает это за вас)
найти далеко, чтобы избежать необходимости копировать исходный список.
источник
Начиная с Java 10 :
List.copyOf()
возвращает неизменяемый объект,List
содержащий элементы данногоCollection
.Данное
Collection
не должно бытьnull
, и оно не должно содержать каких - либоnull
элементов.Кроме того , если вы хотите , чтобы создать глубокую копию
List
, вы можете найти много хороших ответов здесь .источник
В Java 8 есть еще один нулевой безопасный метод.
Если вы хотите пропустить один элемент.
В Java 9+ можно использовать потоковый метод Optional
источник
У меня была та же проблема ConcurrentAccessException и mysolution было:
Таким образом, он выполняет только одну операцию за раз и избегает Exeption ...
источник
Я попытался что-то подобное и смог воспроизвести проблему (IndexOutOfBoundsException). Ниже приведены мои выводы:
1) Реализация Collections.copy (destList, sourceList) сначала проверяет размер целевого списка, вызывая метод size (). Поскольку вызов метода size () всегда будет возвращать количество элементов в списке (в данном случае 0), конструктор ArrayList (capacity) обеспечивает только начальную емкость резервного массива, и это не имеет никакого отношения к размер списка. Следовательно, мы всегда получаем исключение IndexOutOfBoundsException.
2) Относительно простой способ - использовать конструктор, который принимает коллекцию в качестве аргумента:
источник
re:,
indexOutOfBoundsException
аргументы вашего подсписка являются проблемой; вам нужно закончить подсписок размером-1. Поскольку последний элемент списка отсчитывается от нуля, он всегда имеет размер-1, в позиции размера нет элемента, отсюда и ошибка.источник
Вы можете использовать addAll ().
например:
wsListCopy.addAll(wsList);
источник
Я не вижу правильного ответа. Если вам нужна глубокая копия, вам нужно перебрать и скопировать объект вручную (вы можете использовать конструктор копирования).
источник
Если вы не хотите, чтобы изменения в одном списке повлияли на другой список, попробуйте это. У меня это сработало.
Надеюсь, это поможет.
источник
Функция subList - хитрость, возвращенный объект все еще находится в исходном списке. поэтому, если вы выполните какую-либо операцию в subList, это вызовет одновременное исключение в вашем коде, независимо от того, является ли это однопоточным или многопоточным.
источник