1. 新的本机不可修改集合API

自从Java9开始,JDK里面为集合(List/Set/Map)都添加了of和copyOf方法,他们可以来创建不可变的集合。

Question1:什么叫做不可变集合?

不能对集合进行添加、删除、替换、排序等操作,否则会报java.lang.UnsupportedOperationException错误。
示例代码:

List<String> list = List.of("aa", "bb", "cc"); list.add("dd");

报错信息:

Exception in thread "main" java.lang.UnsupportedOperationException     at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:71)     at java.base/java.util.ImmutableCollections$AbstractImmutableCollection.add(ImmutableCollections.java:75)

扩展:Arrays.asList()创建的集合也是一个不可变的集合

Question2:of方法与copyOf方法之间的区别

示例代码:

var list1 = List.of("aa", "bb", "cc"); var copy1 = List.copyOf(list1); System.out.println(list1 == copy1); //运行结果: true  var list2 = new ArrayList<String>(); var copy2 = List.copyOf(list2); System.out.println(list2 == copy2); //运行结果: false

注意:var也是Java11新推出的特性局部变量类型推断,这里面不再赘述。

第一段代码和第二段代码差不多,为什么返回结果不一样呢?我们来看一下他们的源码:

    static <E> List<E> of(E e1, E e2, E e3) {         return new ImmutableCollections.ListN<>(e1, e2, e3);     }      static final class ListN<E> extends AbstractImmutableList<E>             implements Serializable {          static final List<?> EMPTY_LIST = new ListN<>();          @Stable         private final E[] elements;          @SafeVarargs         ListN(E... input) {             // copy and check manually to avoid TOCTOU             @SuppressWarnings("unchecked")             E[] tmp = (E[])new Object[input.length]; // implicit nullcheck of input             for (int i = 0; i < input.length; i++) {                 tmp[i] = Objects.requireNonNull(input[i]);             }             elements = tmp;         }          @Override         public boolean isEmpty() {             return size() == 0;         }