Чи є перевага (чи велика різниця) у використанні Arrays.asList (щось) над Collections.singletonList (щось) для створення списку, що містить один предмет? Остання робить повернений список також незмінним.
Чи є перевага (чи велика різниця) у використанні Arrays.asList (щось) над Collections.singletonList (щось) для створення списку, що містить один предмет? Остання робить повернений список також незмінним.
Відповіді:
Collections.singletonList(something)
є незмінним, тоді як Arrays.asList(something)
є фіксованим розміром List
представлення масиву, де список і масив об'єднуються в купу.
Arrays.asList(something)
дозволяє внести до нього неструктурні зміни , які відображаються як у списку, так і у поєднаному масиві. Він кидає UnsupportedOperationException
для додавання, видалення елементів, хоча ви можете встановити елемент для певного індексу.
Будь-які зміни, внесені до Списку, що повертається, Collections.singletonList(something)
призведе до UnsupportedOperationException
.
Крім того, ємність списку, повернутий Collections.singletonList(something)
завжди, буде 1 на відміну від того, Arrays.asList(something)
чиєю ємністю буде розмір резервного масиву.
Я просто додам, що сингл-лист не підтримується масивом і просто посилається на цей один елемент. Імовірно, це займе менше пам'яті і може бути значним залежно від кількості списків, які ви хочете створити.
Метод Arrays.asList
повертає список фіксованого розміру, підкріплений вказаним масивом. Метод повертає екземпляр, ArrayList
який є приватним вкладеним статичним класом, що розширюється, AbstractList
а не java.util.ArrayList
. Цей статичний клас забезпечує реалізацію декількох методів, наприклад, set, indexOf, forEach, replaceAll
тощо., Але коли ми викликаємо, add
він не має власної реалізації, а метод, з AbstractList
якого викликається, який кидає 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());
Якщо використовується будь-яка з цих двох змінних, значення все одно буде "Apple", а не "Абрикос". Згідно з документом з Java 10 :
List.of
ІList.copyOf
статичні фабричні методи забезпечують зручний спосіб для створення нередактіруемих списків. Екземпляри списку, створені цими методами, мають такі характеристики:
- Вони незмінні . Елементи не можна додавати, видаляти чи замінювати. Виклик будь-якого мутаційного методу у списку завжди призведе
UnsupportedOperationException
до того, що його кинуть. Однак, якщо елементи, що містяться, самі можуть змінюватися, це може спричинити зміну вмісту Списку.- Вони забороняють нульові елементи. Спроби створити їх з нульовими елементами призводять до
NullPointerException
.- Вони серіалізуються, якщо всі елементи серіалізуються.
- Порядок елементів у списку такий самий, як порядок наданих аргументів або елементів у наданому масиві.
- Вони є
value-based
. Абоненти не повинні робити жодних припущень щодо особи, що повертається. Фабрики можуть створювати нові екземпляри або використовувати повторно існуючі. Тому операції, що залежать від ідентичності на цих примірниках (рівність посилань (==), хеш-код ідентифікації та синхронізація), є ненадійними та їх слід уникати.- Вони серіалізуються, як зазначено на сторінці серіалізованої форми .
ImmutableList.of()
іLists.newArrayList()
в суміш.