Есть ли преимущество (или большая разница) в использовании Arrays.asList (что-то) по сравнению с Collections.singletonList (что-то) для создания списка, содержащего один элемент? Последнее также делает возвращаемый список неизменным.
java
collections
Говард Гримберг
источник
источник
ImmutableList.of()
иLists.newArrayList()
в смеси, а также.Ответы:
Collections.singletonList(something)
является неизменным, тогда какArrays.asList(something)
являетсяList
представлением Array фиксированного размера, где List и Array объединяются в куче.Arrays.asList(something)
позволяет вносить неструктурные изменения , которые отражаются как в List, так и в объединенном массиве. ОнUnsupportedOperationException
добавляет для добавления, удаления элементов, хотя вы можете установить элемент для определенного индекса.Любые изменения, внесенные в возвращенный список,
Collections.singletonList(something)
приведут кUnsupportedOperationException
.Кроме того, емкость возвращаемого List
Collections.singletonList(something)
всегда будет равна 1, в отличие от того,Arrays.asList(something)
чья емкость будет равна размеру резервного массива.источник
Я бы просто добавил, что список синглтонов не поддерживается массивом, а просто имеет ссылку на этот элемент. Предположительно, это займет меньше памяти и может быть значительным в зависимости от количества списков, которые вы хотите создать.
источник
Метод
Arrays.asList
возвращает список фиксированного размера, поддерживаемый указанным массивом. Метод возвращает экземпляр,ArrayList
который является частным вложенным статическим классом, расширяющимAbstractList
и не расширяющим егоjava.util.ArrayList
. Этот статический класс обеспечивает реализацию нескольких методов, например,set, indexOf, forEach, replaceAll
и т. Д., Но когда мы вызываемadd
его, он не имеет собственной реализации, скорееAbstractList
вызывается метод from, который выбрасываетjava.lang.UnsupportedOperationException
.В
Collections.singletonList
возвращаете неизменен список , содержащий только указанный объект и это сериализация , а также.Кстати, для неизменяемых списков мы обычно используем,
Collections.unmodifiableList
который возвращает неизменяемое представление указанного списка.Неизменяемая коллекция представлений - это коллекция, которую нельзя изменить, а также представление резервной коллекции. Обратите внимание, что изменения в резервной коллекции все еще возможны, и если они происходят, они видны через неизменяемое представление.
У нас может быть настоящий неизменный список в Java 10 и более поздних версиях. Есть два способа получить действительно неизменяемый список :
var unmodifiableList = List.copyOf(srcList);
var unmodifiableList = srcList.stream().collect(Collectors.toUnmodifiableList());
Если используется любая из этих двух переменных, значением по-прежнему будет «Яблоко», а не «Абрикос».Согласно документу из Java 10 :
источник