Java中如何在声明时初始化二维String类型ArrayList
二维ArrayList声明时初始化的实现方案
完全可以在声明变量时直接完成初始化,不需要逐次创建子列表、逐个add的冗长写法,根据使用的Java版本,有几种常用实现方式:
- 兼容全Java版本的可变列表实现
这种写法从Java 5开始就支持,生成的外层、内层列表都是完全可变的java.util.ArrayList类型,后续可以正常执行add、remove等修改操作:
ArrayList<ArrayList<String>> competitions = new ArrayList<>(Arrays.asList( new ArrayList<>(Arrays.asList("A", "B")), new ArrayList<>(Arrays.asList("B", "C")), new ArrayList<>(Arrays.asList("C", "A")) ));
注意:不要直接把
Arrays.asList的返回值直接塞到ArrayList里,Arrays.asList返回的不是java.util.ArrayList,而是Arrays类内部的固定长度列表实现,直接使用会在后续尝试修改列表时抛出UnsupportedOperationException,必须通过new ArrayList<>(...)重新包装成真正的ArrayList。
- Java 9及以上的简洁写法
可以用官方提供的List.of静态工厂方法替代Arrays.asList,语法更短、空值安全性更高,同样需要把每一层用ArrayList构造器包装成可变版本:
ArrayList<ArrayList<String>> competitions = new ArrayList<>(List.of( new ArrayList<>(List.of("A", "B")), new ArrayList<>(List.of("B", "C")), new ArrayList<>(List.of("C", "A")) ));
- 无需强制使用ArrayList的简化写法
如果后续不需要对列表做修改,完全可以用List接口声明变量,不需要强制指定为ArrayList类型,代码会更简洁:
// Java 9及以上可用,返回不可变嵌套列表 List<List<String>> competitions = List.of( List.of("A", "B"), List.of("B", "C"), List.of("C", "A") );
注意:该写法生成的列表是不可变的,不支持add、remove等修改操作,如果有后续变更需求,还是要使用之前的包装逻辑生成可变ArrayList。
内容的提问来源于stack exchange,提问作者MvsW
相关产品推荐
相关产品推荐

