在java 9之前的版本中,List初始化和添加值需要两步进行。
初始化:
List list = new ArrayList<>();
添加值:用list.add()方法
list.add("1");
list.add("2");
list.add("3");
可以无限的添加。
然后输出:
[1, 2, 3]
但是在java 9中,他的新特性中,List的初始化和添加值就省略成了一步。
初始化和添加值:用List.of()方法
List list1 = List.of("4", "5", "6");
在List.of()中就已经将初始化和添加值完成了。
输出:
[4, 5, 6]
但是这个新特性有个很鸡肋的地方,就是在list.of()完成后,这个list就定长了。再使用list.add()就会报异常。
list1.add("7");
输出:
java.lang.UnsupportedOperationException
为什么会报这个异常呢?我们来看看源码:
list.of()的源码:
static List of(E e1, E e2, E e3) {
return new ImmutableCollections.ListN<>(e1, e2, e3);
}
再继续看ImmutableCollentions.ListN<>的源码:
在new Object(input.length)中,已经将添加的长度定死了。所以就很奇葩了。
然后我就想了一下,导致这种长度定死了的原因就是,在List.of()中传入参数之后,在ListN(E... input)中,将传入的参数变换成了数组,数组的长度是固定的,所以在List.of()之后,被其初始化和添加值之后的 list1 就无法再运用list1.add()方法添加值,扩展长度。然后我就想了一个很low很"愚蠢"的方法,既然你是数组,固定的数组,那行,我再将你的数组强行转化为List,总可以了吧。代码如下:
新建了一个ListUtils类:
调用ListUtils.append()方法:
List list2 = ListUtils.append("7", "8", "9");
初始化和添加值一气呵成,最后输出:
[7,8,9]
再接着添加值:
list2.add("10");
输出:
[7,8,9,10] (不再报错了)
而且在效率上也相差无几: