Czy używanie Arrays.asList (czegoś) w porównaniu z Collections.singletonList (coś) ma przewagę (lub dużą różnicę) w tworzeniu listy zawierającej jeden element? To drugie sprawia, że zwracana lista jest również niezmienna.
java
collections
Howard Grimberg
źródło
źródło
ImmutableList.of()
iLists.newArrayList()
mieszankę.Odpowiedzi:
Collections.singletonList(something)
jest niezmienna podczas gdyArrays.asList(something)
jestList
reprezentacją o stałym rozmiarze Array, w której Lista i Array są łączone w stercie.Arrays.asList(something)
umożliwia zmiany niekonstrukcyjne wprowadzone w nim, które są odzwierciedlane zarówno w Liście, jak i w połączonej tablicy. RzucaUnsupportedOperationException
do dodawania, usuwania elementów, chociaż można ustawić element dla określonego indeksu.Wszelkie zmiany dokonane na liście zwróconej przez
Collections.singletonList(something)
spowodująUnsupportedOperationException
.Ponadto pojemność listy zwracana przez
Collections.singletonList(something)
zawsze będzie wynosić 1, w przeciwieństwie doArrays.asList(something)
pojemności, której wielkość będzie wielkością tablicy obsługiwanej.źródło
Dodam tylko, że lista singleton nie jest poparta tablicą i ma tylko odniesienie do tego jednego elementu. Prawdopodobnie zajmie to mniej pamięci i może być znaczące w zależności od liczby list, które chcesz utworzyć.
źródło
Metoda
Arrays.asList
zwraca listę o stałym rozmiarze wspieraną przez określoną tablicę. Sposób powraca instancjąArrayList
który jest prywatny zagnieżdżone klasy statyczne rozszerzenieAbstractList
niejava.util.ArrayList
. Ta statyczna klasa zapewnia implementację kilku metod, np.set, indexOf, forEach, replaceAll
Itp., Ale kiedy wywołujemy,add
nie ma własnej implementacji, raczejAbstractList
wywoływana jest metoda from, która rzucajava.lang.UnsupportedOperationException
.Collections.singletonList
Zwraca listę niezmienny zawierająca tylko określony obiekt i to jest serializacji jak również.Na marginesie, w przypadku list niezmiennych zwykle używamy,
Collections.unmodifiableList
która zwraca niemodyfikowalny widok określonej listy.Niemodyfikowalna kolekcja widoków to kolekcja, której nie można modyfikować i która jest również widokiem kolekcji zapasowej. Zwróć uwagę, że zmiany w kolekcji zapasowej mogą nadal być możliwe, a jeśli wystąpią, są widoczne w widoku niemodyfikowalnym.
Możemy mieć prawdziwą niezmienną listę w Javie 10 i nowszych. Istnieją dwa sposoby uzyskania listy naprawdę niemodyfikowalnej :
var unmodifiableList = List.copyOf(srcList);
var unmodifiableList = srcList.stream().collect(Collectors.toUnmodifiableList());
Jeśli używana jest którakolwiek z tych dwóch zmiennych, wartością nadal będzie „Apple”, a nie „Apricot”.Jak na dok z Jawy 10 :
źródło