如何创建存储List<List<String>>的集合?求正确定义与实现方式
首先明确你需要的集合类型:你要存储多个List<List<String>>类型的outer实例,所以NewListofAllOuters的类型应该是 List<List<List<String>>> —— 简单来说,就是“存储列表的列表的列表”,每个顶层元素就是你的outer(也就是List<List<String>>)。
你现有代码的核心问题
你当前的写法是在循环外创建outer、inner1、inner2的实例,然后每次循环调用clear()清空内容再重新添加元素,最后把同一个outer引用加入新列表。这会导致一个严重问题:新列表里的所有元素其实都是同一个outer对象的引用,最后你看到的结果会是所有元素都和最后一次循环的outer内容一致(甚至可能全是空,取决于循环结束时的状态),因为你一直在修改同一个对象。
正确的实现方式
要解决这个问题,你需要在每次循环内部创建新的outer、inner1、inner2实例,这样每个循环生成的outer都是独立的对象,添加到新列表后不会互相影响。
完整代码示例:
// 定义目标集合:存储多个List<List<String>>实例 List<List<List<String>>> newListOfAllOuters = new ArrayList<>(); for(String elements : someList) { // 每次循环都创建新的inner和outer实例,而不是复用旧的 List<String> inner1 = new ArrayList<>(); List<String> inner2 = new ArrayList<>(); List<List<String>> outer = new ArrayList<>(); inner1.add("abc"); inner1.add("xyz"); inner2.add("ijk"); inner2.add("mno"); outer.add(inner1); outer.add(inner2); // 将独立的outer实例添加到目标集合 newListOfAllOuters.add(outer); } // 打印验证,会得到你期望的格式 System.out.println(newListOfAllOuters);
为什么这样可行?
每次循环中,inner1、inner2、outer都是全新的对象,它们的内存地址不同,所以添加到newListOfAllOuters后,每个元素都是独立的嵌套列表,不会因为后续循环的修改而改变之前的内容。
额外说明
如果你需要用Set而不是List来存储(比如要自动去重),那么你需要注意:默认情况下,ArrayList的equals()和hashCode()是基于元素内容的,所以如果两个outer的内部inner列表内容完全一致,HashSet会认为它们是重复元素并自动去重。但如果你需要保留所有实例(即使内容相同),还是用ArrayList更合适。
内容的提问来源于stack exchange,提问作者StephGonnaSteph

