簡體   English   中英

JDK的Arrays與Guava的ImmutableList

[英]JDK's Arrays vs. Guava's ImmutableList

使用com.google.common.collect.ImmutableList.of(...)java.util.Arrays.asList(...)創建單行列表之間是否有優勢?

Arrays.asList(...)方法提供了底層數組的列表視圖

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與不變性幾乎沒有關系。 返回的列表不能添加或刪除元素,但可以更改它,並且更改會更改基礎數組。 實際上,返回列表的類是一個使用該數組進行存儲的特殊類。 它與此類似:

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.

只有當拋出原始列表時,這才是安全的,就像在這個地圖示例中一樣。 由於map超出范圍,因此無法更改不可修改地圖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的ImmutableList會創建一個新的數據副本。 引用其文檔

記住ImmutableXXX.copyOf在安全的情況下嘗試避免復制數據是很有用的 - 具體細節未指定,但實現通常是“智能”。

因此,番石榴有其不可變的收藏品獨立於它們的起源。

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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM