Java嵌套ArrayList未正确添加

Java嵌套ArrayList未正确添加,java,Java,我一直在尝试嵌套的arrayList方法。我有个问题 public static void main(String[] args) { List<List<Integer>> list = new ArrayList<>(); List<Integer> subList = new ArrayList<Integer>(){{ add(1); add(2); }}; lis

我一直在尝试嵌套的arrayList方法。我有个问题

public static void main(String[] args) {
    List<List<Integer>> list = new ArrayList<>();
    List<Integer> subList = new ArrayList<Integer>(){{
        add(1);
        add(2);
    }};
    list.add(subList);
    subList.clear();
    subList.add(3);
    subList.add(4);
    list.add(subList);
    System.out.println(list);
}
而不是
[[1,2],[3,4]]

我的代码有什么问题


编辑:我还有一些关于代码的问题。我应该创建一个新的quetsion还是将它添加到这里。

我建议您不要使用双括号初始化
newarraylist{{}
,因为它是一种反模式,也会创建匿名内部类

对于错误,您应该初始化一个新列表,而不是
clear()

publicstaticvoidmain(字符串[]args){
列表=新的ArrayList();
列表子列表=新的ArrayList();
子列表。添加(1);
子列表。添加(2);
列表。添加(子列表);
subList=新的ArrayList();
子列表。添加(3);
子列表。添加(4);
列表。添加(子列表);
系统输出打印项次(列表);
}
调用clear不会更改对ArrayList的引用,而是指向同一对象。您应该通过调用
subList=new ArrayList()

关于双大括号初始化的不良影响的一本好书

编辑:正如@NoDataFound所建议的,如果您使用的是Java8+,那么创建列表的过程可以简化得多

如果您使用的是Java8,那么可以使用

List<Integer> subList = Arrays.asList(1, 2);
List subList=Arrays.asList(1,2);
如果您使用的是Java9+,那么可以使用

List<Integer> subList = List.of(1, 2);
List subList=List.of(1,2);

请添加正确的标记。您只是将子列表的引用添加到列表中。您需要创建一个新的子列表,而不是清除旧的子列表。您所创建的:
list=[sublist,sublist]
请注意,您只有一个子列表,其中有两个引用。我非常同意双括号方法。使用它的人通常不理解它真正的含义,因为真正理解它真正含义的人通常避免使用它。这是一件令人憎恶的事。当然,关于OP问题的本质,你也是对的。你应该补充一点,调用
newarraylist+add
可以完全被
数组取代。asList(1,2)
数组。asList(3,4)
,或者在Java 9++中,
List.of(1,2)
List.of(3,4)
。是@JohnBollinger。这就是为什么我认为我也应该添加这一点,尽管这似乎与实际问题无关。@nodata发现这是真的。将添加.tysm@BlackPearl。。!
List<Integer> subList = Arrays.asList(1, 2);
List<Integer> subList = List.of(1, 2);