2013-06-19 10 views

Antwort

22

Die Arrays.asList(...)-Methode bietet eine Liste Ansicht des zugrunde liegenden Array.

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 hat sehr wenig mit Unveränderlichkeit zu tun. In der zurückgegebenen Liste können keine Elemente hinzugefügt oder entfernt werden, sie kann jedoch geändert werden, und Änderungen ändern das zugrunde liegende Array. Tatsächlich ist die Klasse der zurückgegebenen Liste eine spezielle, die das Array für den Speicher verwendet. Es ist ähnlich zu diesem:

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. 

Das ist nur sicher, wenn man die ursprüngliche Liste wegwirft, wie in diesem Kartenbeispiel. Da map den Gültigkeitsbereich verlässt, kann nichts die zugrunde liegende Karte der nicht änderbaren Karte CAPITALS ändern.

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 der ImmutableList erstellt eine neue Kopie der Daten, wenn die ursprünglichen Daten nicht unabänderlich selbst gespeichert ist. Zitiert seine docs:

Es ist nützlich, sich daran zu erinnern, dass ImmutableXXX.copyOf die Daten zu vermeiden versucht zu kopieren, wenn es sicher ist, dies zu tun - die genauen Details nicht näher bezeichnet sind, aber die Umsetzung ist in der Regel „smart“.

So hat Guava seine unveränderlichen Sammlungen unabhängig von ihren Ursprüngen.

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. 
+0

+1 kurze Erklärung – ajduke

Verwandte Themen