Java11新特性 - 新加一些实用的API
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; }