網頁

2019/7/29

Java 9 List.of()用法

Java 9在List介面新增了List.of(E... elements)方法,其用法如下。

List<String> stringList = List.of("a", "b", "c");
List<Integer> intList = List.of(1, 2, 3);

List.of(E... elements)方法讓我們在程式中方便建立不可變的list物件(Immutable List)


要特別注意的是List.of()產生的list物件並非傳統的ArrayList物件,而是使用內部的工廠方法ImmutableCollections.ListN()建立的ListN物件。其建立的list具有以下特性:

  • 結構不可變(structurally immutable)。若呼叫List.add()新增元素,List.remove()刪除元素,List.replace()List.set()取代元素等改變list結構的方法則會拋出UnsupportedOperationException錯誤。不過list中的元素的內容仍是可變的。
  • 傳入的元素不允許null。若傳入的參數為null則拋出NullPointerExcception
  • list中的元素順序與傳入參數時的順序一樣。
  • value-based物件,應避免對其使用物件識別敏感(identity-sensitive)的操作,簡單說就是比較時不要用==,應使用equals()
  • 是可序列化的(Serializable)

例如在List.of()產生的list新增一個元素如下,會丟出UnsupportedOperationException錯誤。

List<Integer> intList = List.of(1, 2, 3);
intList.add(4); // throw UnsupportedOperationException

List.of()產生的list移除元素,也會丟出UnsupportedOperationException錯誤。

List<Integer> intList = List.of(1, 2, 3);
intList.remove(Integer.valueOf(2)); // throw UnsupportedOperationException

List.of()產生的list替換元素,也會丟出UnsupportedOperationException錯誤。

List<Integer> intList = List.of(1, 2, 3);
intList.set(0, 5);); // throw UnsupportedOperationException

傳入的元素若為null,會丟出NullPointerException

List<String> stringList = List.of("a", "b", "c", null); // throw NullPointerException

List.of()產生的list可序列化(Serializable)(當然裝載的元素物件也要可序列化)。

但注意List.of()產生的list有自己的Serialized Form實作,所以用JDK 9以前的版本是無法反序列化的。

List<Integer> serializedList = List.of(1, 2, 3);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:/list"));
oos.writeObject(serializedList);
oos.flush();
oos.close();

List<Integer> deserializedList;
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:/list"));
deserializedList = (List<Integer>) ois.readObject();
ois.close();
System.out.println(deserializedList); // [1, 2, 3]

你可能會覺這和Arrays.asList()很類似,不過兩者在特性上仍有些差異


參考:

沒有留言:

張貼留言