Czy istnieją zalety między tworzeniem listy w jednym wierszu a com.google.common.collect.ImmutableList.of(...)
i java.util.Arrays.asList(...)
?Tablice JDK vs. ImmutableList Guawy
Odpowiedz
Metoda Arrays.asList(...)
zapewnia listę , widok z podstawowej tablicy.
Integer[] numbers = {17, 42, 2001};
List<Integer> list = Arrays.asList(numbers);
System.out.println(list.get(0)); // Prints 17.
list.remove(0); // throws.
numbers[0] = 1;
System.out.println(list.get(0)); // Prints 1.
list.set(0, 17);
System.out.println(numbers[0]); // Prints 17.
Arrays.asList
ma bardzo niewiele wspólnego z niezmiennością. Zwrócona lista nie może zawierać elementów dodanych ani usuniętych, ale można ją zmienić, a zmiany zmieniają bazową tablicę. W rzeczywistości klasa zwróconej listy jest specjalną, która używa tablicy do przechowywania. Jest to podobne do tego:
List<Integer> integers = new ArrayList<>();
integers.add(17);
integers.add(42);
integers.add(2001);
List<Integer> unmodifiable = Collections.unmodifiableList(integers);
unmodifiable.set(0, 1); // throws.
unmodifiable.remove(0); // throws.
unmodifiable.add(867_5309); // throws.
integers.set(0, 1) // okay.
System.out.println(unmodifiable.get(0)); // Prints 1.
Jest to bezpieczne tylko wtedy, gdy wyrzuci się oryginalną listę, tak jak w tym przykładzie mapy. Ponieważ map
wychodzi poza zakres, nic nie może zmienić podstawowej mapy niezmodyfikowanej mapy CAPITALS
.
public static final Map<String, String> CAPITALS;
static {
Map<String, String> map = new HashMap<>();
map.put("USA", "Washington, DC");
map.put("England", "London");
// ...
CAPITALS = Collections.unmodifiableMap(map);
}
Guava na ImmutableList
tworzy nową kopię danych, czy oryginalne dane nie są przechowywane niezmiennie sama. Cytując jego docs:
Warto pamiętać, że ImmutableXXX.copyOf próbuje uniknąć kopiowania danych, gdy jest to bezpieczne - dokładne dane są nieokreślone, ale realizacja jest zwykle „inteligentne”.
Tak, Guava ma swoje niezmienne kolekcje niezależnie od ich pochodzenia.
List<Integer> original = new ArrayList<>();
original.add(1);
original.add(2);
original.add(3);
ImmutableList<Integer> immutable = ImmutableList.copyOf(original);
immutable.set(0, 42); // throws.
System.out.println(immutable.get(0)); // Prints 1.
original.set(0, 42); // fine.
System.out.println(immutable.get(0)); // Prints 1.
ImmutableList<Integer> copy = ImmutableList.copyOf(immutable);
// Shares immutable's data.
- 1. Guava ImmutableList copyOf vs Builder
- 2. JDK 1.7 vs JDK 1.6 klas wewnętrzne różnicy spadków
- 3. Obiekty javascript vs tablice vs JSON
- 4. ImmutableList nie rozszerza listy?
- 5. tablice zero length vs. wskaźniki
- 6. Najlepszy sposób używania guawy
- 7. Sortowanie guawy BiMap
- 8. Deserializowanie ImmutableList za pomocą Gsona
- 9. Tablice w Ruby: Take vs Limit vs Pierwszy
- 10. Jak to zrobić, używając guawy?
- 11. Przełącz z jdk na Sun jdk
- 12. Różnica między jdk 1.6 i jdk 1.7?
- 13. IllegalAccessError do stoper guawy jest z org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus
- 14. Złożony klucz do Cache guawy (zmiany biegów)
- 15. Fortran: dynamiczne tablice vs. automatyczna tablica Unikanie alokacji pamięci
- 16. Zakładane tablice rozmiarów: Colon kontra gwiazdka - DIMENSION (:) arr vs. arr (*)
- 17. Dlaczego ImmutableList Guava ma tak wiele przeciążonych metod()?
- 18. Tablice skrzyżowań a tablice kluczy obcych?
- 19. Pobieranie IBM J9 JDK
- 20. Wiązanie JDK/JRE
- 21. Eclipse i JDK 7
- 22. Ścieżka JDK Oracle SqlDeveloper
- 23. Tablice JavaScript
- 24. Czy istnieje sposób użycia konstrukcji dla każdego stołu Guawy?
- 25. Różnice między Greenrobot EventBus i guawy za EventBus
- 26. Zbieraj na ListMultiMapę Guawy przy użyciu strumieni Java 8
- 27. Dlaczego potrzebuję jsr305 do używania guawy w scala?
- 28. Jak zbudować dla JDK 1.1.8?
- 29. Jak obejść to ograniczenie JDK?
- 30. Czy javax.tools zależy od JDK?
+1 zwięzłe wyjaśnienie – ajduke