Есть ли преимущество (или большая разница) в использовании Arrays.asList (что-то) по сравнению с Collections.singletonList (что-то) для создания списка, содержащего один элемент? Последнее также делает возвращаемый список неизменным.
Есть ли преимущество (или большая разница) в использовании Arrays.asList (что-то) по сравнению с Collections.singletonList (что-то) для создания списка, содержащего один элемент? Последнее также делает возвращаемый список неизменным.
Ответы:
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
который возвращает неизменяемое представление указанного списка.
List<String> srcList = Arrays.asList("Apple", "Mango", "Banana");
var fruits = new ArrayList<>(srcList);
var unmodifiableList = Collections.unmodifiableList(fruits);
fruits.set(0, "Apricot");
var modFruit = unmodifiableList.get(0);
System.out.println(modFruit); // prints Apricot
Неизменяемая коллекция представлений - это коллекция, которую нельзя изменить, а также представление резервной коллекции. Обратите внимание, что изменения в резервной коллекции все еще возможны, и если они происходят, они видны через неизменяемое представление.
У нас может быть настоящий неизменный список в Java 10 и более поздних версиях. Есть два способа получить действительно неизменяемый список :
var unmodifiableList = List.copyOf(srcList);
var unmodifiableList = srcList.stream().collect(Collectors.toUnmodifiableList());
Если используется любая из этих двух переменных, значением по-прежнему будет «Яблоко», а не «Абрикос». Согласно документу из Java 10 :
List.of
ИList.copyOf
статические фабричные методы обеспечивают удобный способ для создания нередактируемых списков. Экземпляры List, созданные этими методами, имеют следующие характеристики:
- Они не поддаются изменению . Элементы не могут быть добавлены, удалены или заменены. Вызов любого метода-мутатора в Списке всегда приводит
UnsupportedOperationException
к выбрасыванию. Однако, если содержащиеся элементы сами изменяются, это может привести к изменению содержимого списка.- Они запрещают нулевые элементы. Попытки создать их с нулевыми элементами приводят к
NullPointerException
.- Они сериализуемы, если все элементы сериализуемы.
- Порядок элементов в списке совпадает с порядком предоставленных аргументов или элементов в предоставленном массиве.
- Они есть
value-based
. Вызывающие абоненты не должны делать никаких предположений относительно личности возвращенных экземпляров. Фабрики могут создавать новые экземпляры или повторно использовать существующие. Поэтому чувствительные к идентичности операции в этих случаях (ссылочное равенство (==), хэш-код идентичности и синхронизация) ненадежны и их следует избегать.- Они сериализуются, как указано на странице « Сериализованная форма» .
ImmutableList.of()
иLists.newArrayList()
в смеси, а также.