8.8.4 设置不可变集合

8.8.4 设置不可变集合

Collections提供了如下三类方法来返回一个不可变的集合。

empty方法

这类方法返回一个空的、不可变的集合对象

方法 描述
static <T> Enumeration<T> emptyEnumeration() Returns an enumeration that has no elements.
static <T> Iterator<T> emptyIterator() Returns an iterator that has no elements.
static <T> List<T> emptyList() Returns an empty list (immutable).
static <T> ListIterator<T> emptyListIterator() Returns a list iterator that has no elements.
static <K,​V> Map<K,​V> emptyMap() Returns an empty map (immutable).
static <K,​V> NavigableMap<K,​V> emptyNavigableMap() Returns an empty navigable map (immutable).
static <E> NavigableSet<E> emptyNavigableSet() Returns an empty navigable set (immutable).
static <T> Set<T> emptySet() Returns an empty set (immutable).
static <K,​V> SortedMap<K,​V> emptySortedMap() Returns an empty sorted map (immutable).
static <E> SortedSet<E> emptySortedSet() Returns an empty sorted set (immutable).

singleton方法

这类方法返回一个只包含指定对象(只有一个或一项元素)的、不可变的集合对象

方法 描述
static <T> Set<T> singleton(T o) Returns an immutable set containing only the specified object.
static <T> List<T> singletonList(T o) Returns an immutable list containing only the specified object.
static <K,​V> Map<K,​V> singletonMap(K key, V value) Returns an immutable map, mapping only the specified key to the specified value.

unmodifiable方法

返回指定集合对象的不可变视图

方法 描述
static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c) Returns an unmodifiable view of the specified collection.
static <T> List<T> unmodifiableList(List<? extends T> list) Returns an unmodifiable view of the specified list.
static <K,​V> Map<K,​V> unmodifiableMap(Map<? extends K,​? extends V> m) Returns an unmodifiable view of the specified map.
static <K,​V> NavigableMap<K,​V> unmodifiableNavigableMap(NavigableMap<K,​? extends V> m) Returns an unmodifiable view of the specified navigable map.
static <T> NavigableSet<T> unmodifiableNavigableSet(NavigableSet<T> s) Returns an unmodifiable view of the specified navigable set.
static <T> Set<T> unmodifiableSet(Set<? extends T> s) Returns an unmodifiable view of the specified set.
static <K,​V> SortedMap<K,​V> unmodifiableSortedMap(SortedMap<K,​? extends V> m) Returns an unmodifiable view of the specified sorted map.
static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s) Returns an unmodifiable view of the specified sorted set.

上面三类方法的参数是原有的集合对象,返回值是该集合的”只读”版本。通过Collections提供的三类方法,可以生成”只读”的CollectionMap

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.util.*;

public class UnmodifiableTest
{
public static void main(String[] args)
{
// 创建一个空的、不可改变的List对象
List unmodifiableList = Collections.emptyList();
// 创建一个只有一个元素,且不可改变的Set对象
Set unmodifiableSet = Collections.singleton("疯狂Java讲义");
// 创建一个普通Map对象
Map scores = new HashMap();
scores.put("语文" , 80);
scores.put("Java" , 82);
// 返回普通Map对象对应的不可变版本
Map unmodifiableMap = Collections.unmodifiableMap(scores);
// 下面任意一行代码都将引发UnsupportedOperationException异常
//①
unmodifiableList.add("测试元素");
//②
unmodifiableSet.add("测试元素");
//③
unmodifiableMap.put("语文" , 90);
}
}

上面程序的三行粗体字代码分别定义了一个空的、不可变的List对象,一个只包含一个元素的、不可变的Set对象和一个不可变的Map对象。不可变的集合对象只能访问集合元素,不可修改集合元素。所以上面程序中①②③处的代码都将引发UnsupportedOperationException异常。