Z przeglądu struktury kolekcji :
Kolekcje, które nie obsługują operacji modyfikacji (takich jak
add
,remove
iclear
) są nazywane niemodyfikowalnymi . Kolekcje, których nie można modyfikować, można modyfikować .Kolekcje, które dodatkowo gwarantują, że żadna zmiana w
Collection
obiekcie nie będzie widoczna, nazywane są niezmiennymi . Kolekcje, które nie są niezmienne, są zmienne .
Nie mogę zrozumieć różnicy.
Jaka jest różnica między niemodyfikowalnym a niezmiennym w tym miejscu?
źródło
list
. Jeśli coś może później zadzwonić,list.add(10)
tocoll
odzwierciedli tę zmianę, więc nie, nie nazwałbym tego niezmiennym.Zasadniczo
unModifiable
kolekcja jest widokiem, więc pośrednio może być nadal „modyfikowana” z innego odniesienia, które można modyfikować. Również jako widok tylko do odczytu innej kolekcji, gdy kolekcja źródłowa ulegnie zmianie, niemodyfikowalna kolekcja będzie zawsze prezentować najnowsze wartości.Jednak
immutable
Collection można traktować jako kopię tylko do odczytu innej kolekcji i nie można jej modyfikować. W takim przypadku, gdy zmienia się kolekcja źródłowa, niezmienna kolekcja nie odzwierciedla zmianOto przykład do wizualizacji tej różnicy.
Wynik
źródło
modifiableList
i rozmiarunModifiableList
zwiększonyimmutableList
nie uległy zmianienew ArrayList<String>(modifiableList)
immutableList nie można zmodyfikowaćnew ArrayList<String>(modifiableList)
powodunew
? Dzięki.Myślę, że główna różnica polega na tym, że właściciel mutowalnej kolekcji może chcieć zapewnić dostęp do kolekcji do innego kodu, ale zapewnić ten dostęp przez interfejs, który nie pozwala innemu kodowi na modyfikowanie kolekcji (przy jednoczesnym zastrzeganiu tej możliwości do kodu właściciela). Dlatego kolekcja nie jest niezmienna, ale niektórzy użytkownicy nie mogą zmieniać kolekcji.
Samouczek Oracle Java Collection Wrapper ma do powiedzenia (dodano uwydatnienie):
źródło
Jeśli mówimy o JDK
Unmodifiable*
vs guawaImmutable*
, w rzeczywistości różnica dotyczy również wydajności . Zbiory niezmienne może być zarówno szybsze i bardziej wydajne pamięci, jeśli są one nie obwolut wokół stałych kolekcjach (JDK implementacje są obwolut). Cytując zespół guawy :JDK udostępnia metody Collections.unmodifiableXXX, ale naszym zdaniem mogą to być
<...>
źródło
List.of(...)
faktycznie kopiuje dwa razy!Cytując samouczki Java ™ :
(podkreślenie moje)
To naprawdę podsumowuje.
źródło
Jak wspomniano powyżej niemodyfikowalna nie jest niezmienna, ponieważ niemodyfikowalna kolekcja może zostać zmieniona, jeśli na przykład niemodyfikowalna kolekcja ma bazową kolekcję delegatów, do której odwołuje się jakiś inny obiekt, a ten obiekt ją zmienia.
Jeśli chodzi o niezmienne, nie jest nawet dobrze zdefiniowane. Jednak ogólnie oznacza to, że obiekt „nie ulegnie zmianie”, ale należałoby to zdefiniować rekurencyjnie. Na przykład mogę zdefiniować niezmienne w klasach, których zmienne instancji są wszystkimi elementami pierwotnymi i których metody nie zawierają żadnych argumentów i zwracają prymitywy. Następnie metody rekurencyjnie zezwalają, aby zmienne wystąpienia były niezmienne, a wszystkie metody zawierały niezmienne argumenty, które zwracają niezmienne wartości. Należy zagwarantować, że metody będą zwracać tę samą wartość w czasie.
Zakładając, że możemy to zrobić, istnieje również pojęcie bezpieczne. I możesz uwierzyć, że niezmienny (lub niezmienny w czasie) oznacza również bezpieczeństwo wątków. Jednak tak nie jesti to jest główna kwestia, którą tutaj poruszam, która nie została jeszcze odnotowana w innych odpowiedziach. Mogę skonstruować niezmienny obiekt, który zawsze zwraca te same wyniki, ale nie jest bezpieczny wątkowo. Aby to zobaczyć, załóżmy, że konstruuję niezmienną kolekcję, utrzymując dodawanie i usuwanie w czasie. Teraz niezmienna kolekcja zwraca swoje elementy, patrząc na kolekcję wewnętrzną (która może się zmieniać w czasie), a następnie (wewnętrznie) dodając i usuwając elementy, które zostały dodane lub usunięte po utworzeniu kolekcji. Oczywiście, chociaż kolekcja zawsze zwracałaby te same elementy, nie jest bezpieczna wątkowo tylko dlatego, że nigdy nie zmieni wartości.
Teraz możemy zdefiniować niezmienne jako obiekty, które są bezpieczne dla wątków i nigdy się nie zmienią. Istnieją wytyczne dotyczące tworzenia niezmiennych klas, które generalnie prowadzą do takich klas, jednak należy pamiętać, że mogą istnieć sposoby tworzenia niezmiennych klas, które wymagają uwagi na bezpieczeństwo wątków, na przykład, jak opisano w powyższym przykładzie kolekcji „migawka”.
źródło
Samouczki Java ™ zawierają następujące informacje:
Myślę, że to wystarczająco dobre wyjaśnienie, aby zrozumieć różnicę.
źródło