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()
很類似,不過兩者在特性上仍有些差異。
參考:
沒有留言:
張貼留言