关于创建List的时候添加元素之Arrays.asList()与Java9开始的集合的新特性List.of()及new ArrayList(){{}}

在使用集合的时候,常常希望创建的同时就添加一些元素,而不是创建完再去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 工具包也可以实现

********************************* 不积跬步无以至千里,不积小流无以成江海 *********************************

猜你喜欢

转载自blog.csdn.net/weixin_42465125/article/details/88654128