在使用集合的时候,常常希望创建的同时就添加一些元素,而不是创建完再去add,要实现这个,下面介绍几种方法实现这个简单的需求和使用中的一些注意点
第一种:使用工具类java.util.Arrays的asList方法
@Test
public void testArraysAsList() {
List<String> list = Arrays.asList("a", "b");
// 特别要注意是的Arrays.asList放回的List是一个定长的List,实际上是一个实现了List接口的内部类
list.add("c"); // throw new UnsupportedOperationException();
}
下面是关于上面代码的源码解析:
AbstractList类中的add方法:
第二种:Java9及其以后的集合新特效List.of()方法
List<String> list = List.of("4", "5", "6");
// 同样的List.of方法产生的是一个不可变List,所以add也是会报错的
list.of()的源码:
static <E> List<E> of(E e1, E e2, E e3) {
return new ImmutableCollections.ListN<>(e1, e2, e3);
}
第三种:这种纯粹是一种语法糖,LZ也是无意中接触到的就是使用这个语法格式new ArrayList(){{ }} 双括号,这实际上是创建一个ArrayList的一个子类,所以创建子类的同时就可以重写add方法来添加
https://stackoverflow.com/questions/924285/efficiency-of-java-double-brace-initialization
使用实例初始化程序创建匿名内部类(也称为“双括号初始化”):最终得到的是ArrayList的一个子类,将子类指向父类是可以的,因为Java的多态
它看起来像Java的“隐藏”功能,但它只是重写父类的方法而已,介于这种语法比较怪,而且可能有很多隐形的坑,建议只简单使用即可
它使类路径混乱【因为内部内会生成额外的.class文件】,减慢了类加载速度,并使代码更加模糊 在新的Java 9 Set<String> flavors = Set.of("vanilla", "strawberry", "chocolate", "butter pecan");,可以使用Google Collections工具,Apache Collections
ArrayList<String> arrayList = new ArrayList<String>() {
{
add("Test"); // 创建的同时可以调用List的方法,而且返回一个List,Map一样,这样实际是创建一个ArrayList子类
}
};
当然可以对上面的不可add的进行一些简单的封装成工具类,让他支持就可以了,或者使用Google | Apache 的Collections 工具包也可以实现
********************************* 不积跬步无以至千里,不积小流无以成江海 *********************************