Java中如何让一个集合不可改变?

Java中如何让一个集合不可改变?

  • Java8及之前:Collections工具类中提供的方法:unmodifiableXXX()
    • 示例:
    • 源码:
  • Java9 XXX.of()

Java8及之前:Collections工具类中提供的方法:unmodifiableXXX()

方法 参数列表 功能
unmodifiableList() unmodifiableList(List list) 返回指定list的不可修改视图
unmodifiableMap() unmodifiableMap(Map m) 返回指定map的不可修改视图
unmodifiableSet() unmodifiableSet(Set s) 返回指定set的不可修改视图
unmodifiableCollection() unmodifiableCollection(Collection c) 返回指定集合的不可修改视图

示例:

Java中如何让一个集合不可改变?_第1张图片

Java中如何让一个集合不可改变?_第2张图片

源码:

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;
	}
}

Java中如何让一个集合不可改变?_第3张图片

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
Java中如何让一个集合不可改变?_第4张图片

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......)
  1. of()只能接口.of(),不能在实现类中使用
  2. 返回的集合不可改变,进行add、put、remove等修改操作会抛出异常
  3. Set和Map调用of()时,添加重复元素/键会抛出异常

你可能感兴趣的:(Java集合面试,java,开发语言)