Java中如何让一个集合不可改变?
Java8及之前:Collections工具类中提供的方法:unmodifiableXXX()
示例:
源码:
unmodifiableCollection()源码
public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c) { return new UnmodifiableCollection<>(c); } static class UnmodifiableCollection<E> implements Collection<E>, Serializable { //fianl修饰的集合,不可改变 final Collection<? extends E> c; //将传入的集合参数指向UnmodifiableCollection类中的c UnmodifiableCollection(Collection<? extends E> c) { if (c==null) throw new NullPointerException(); this.c = c; } }
unmodifiableMap()源码类似
public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K, ? extends V> m) { return new UnmodifiableMap<>(m); } private static class UnmodifiableMap<K,V> implements Map<K,V>, Serializable { private final Map<? extends K, ? extends V> m; UnmodifiableMap(Map<? extends K, ? extends V> m) { if (m==null) throw new NullPointerException(); this.m = m; } }
修改Map的方法也都抛出了异常UnsupportedOperationException
Java9 XXX.of()
List、Set、Map接口新增了静态的of()方法,可以给集合一次性添加多个元素 static List of(E... elements)
-
List.of(); List.of(1,2,3) Set.of(); Set.of(1,2,3) Map.of(); Map.of(k1,v1,k2,v2,k3,v3......)
- of()只能接口.of(),不能在实现类中使用
- 返回的集合不可改变,进行add、put、remove等修改操作会抛出异常
- Set和Map调用of()时,添加重复元素/键会抛出异常