2016-09-08 31 views
8

Jeśli masz instancję List<String> strings, by zachować piśmie:List.of (...) lub Collections.unmodifiableList()

Collections.unmodifiableList(strings) 

lub przełączyć się na:

List.of(strings.toArray(new String[strings.size()])) 

Co znajduje się w początkowej wpływ na wydajność (pamięć i czas wykonania) chwili obecnej? Czy w wariancie List.of jest dostępne środowisko wykonawcze?

+0

Korzyści runtime z "unmodifiableList" na tworzenie. A jeśli 'string' jest' ArrayList', nie ma powodu dla 'List.of'. –

+0

Możliwy duplikat [Jaka jest różnica między List.of i Arrays.asList?] (Https://stackoverflow.com/questions/46579074/what-is-the-difference-between-list-of-arrays- aslist) – Mark

Odpowiedz

6

To naprawdę nie jest dobre porównanie, ponieważ takie podejście robić różne rzeczy:

  • Collections::unmodifiable... tworzy niemodyfikowalne pogląd. Jest niezmienna, ponieważ zmienia się, jeśli zmieniasz oryginalną kolekcję kopii zapasowej (list w twoim przykładzie).
  • ...::of z drugiej strony tworzy niezmienną kopię. Zmiana oryginalnej listy nie wpłynie na to.

Z widoku wydajności jest oczywiste, że tworzenie nie-modyfikowalnego opakowania jest tańsze, ponieważ tworzy tylko jedną instancję z jednym polem. Nowe metody fabryczne stworzą co najmniej jeden obiekt, być może wspierany przez tablicę (jeśli masz trzy lub więcej elementów), którą trzeba skopiować.

Dostęp może być szybszy w nowych niezmiennych kolekcjach, ale wymagałoby to porównania.

Ale poprawność podnosi wydajność. Co potrzebujesz Potrzebujesz? Jeśli potrzebujesz niezmiennej kopii, użyj nowych metod (lub Guva Immutable..., które wolałbym). Jeśli potrzebujesz coś niezmiennego, użyj i wyrzuć oryginał (i upewnij się, że tak pozostanie). Jeśli potrzebujesz widoku, którego dzwoniący nie może edytować, użyj numeru unmodifiable....

4

Według JEP 269 (Convenience Factory Methods for Collections):

Gole

Zapewnić statyczne metody fabryki na interfejsy kolekcji, która będzie tworzą zwarte, żadnych modyfikacji instancji kolekcji. Interfejs API to celowo utrzymywany w minimalnym zakresie.

Non-Cele

  • To nie jest celem, aby zapewnić w pełni Generalny „zbierania builder” obiekt, który, na przykład, pozwala kontrolować użytkownikowi realizację kolekcja lub różne cechy, takie jako zmienność, spodziewany rozmiar, współczynnik obciążenia, poziom współbieżności i oczekiwany rozmiar: .

  • Celem nie jest wspieranie wysokowydajnych, skalowalnych kolekcji z dowolną liczbą elementów. Koncentruje się na małych kolekcjach.

  • Celem nie jest zapewnienie niezmiennych typów kolekcji. To jest, ta propozycja nie ujawnia cechy niemodyfikowalnej w systemie typu, nawet jeśli proponowane implementacje są w rzeczywistości niemodyfikowalne.

  • Celem nie jest dostarczanie "niezmiennych trwałych" lub "funkcjonalnych" kolekcji .

+0

Dodaj streszczenie tego, co chcesz wyrazić: twój punkt widzenia nie jest całkiem jasny, chociaż mogę zgadnąć. –

+0

Czy są konstruowane metody 'Collections.unmodifiableXyz' dla wysokiej wydajności? Może test JMH pokaże różnicę. Mój przypadek użycia zajmuje 99% przy małych listach. To byłoby zgodne z celem JEP 269. – Sormuras