这就是你现在拥有的
ArrayList<ArrayList<Integer>> outer = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> inner = new ArrayList<Integer>();
将创建
outer -> []
inner -> []
之后
inner.add(100);
inner.add(200);
你的情况看起来像
outer -> []
inner -> [100, 200]
令人困惑的部分来了
outer.add(inner);
outer.add(inner);
实际上复制了 inner 引用的值,这意味着它们指向来自 inner 的相同列表
outer -> [ reference1 , reference2 ]
| |
+-------+ |
+---------------------+
↓
inner +-> [100, 200]
这意味着如果您更改inner 持有的列表状态,您将能够使用reference1 和reference2 看到这些更改。如果您通过其他引用更改此列表,则相同,因此当您使用
outer.get(0).add(300);
get(0) 返回列表,您也可以通过inner 或get(1) 访问该列表并添加新元素,所以现在情况看起来像
outer -> [ reference1 , reference2 ]
| |
+-------+ |
+---------------------+
↓
inner -> [100, 200, 300]
这就是为什么当你打印 outer 时你会看到
[[100, 200, 300], [100, 200, 300]].
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
from get(0) from get(1)
您真正需要的是创建单独的列表,这样reference1 和reference2 将指向两个单独的列表。所以你需要类似的东西
outer -> []
inner1 -> [100, 200]
inner2 -> [100, 200]
后面会整理到
outer -> [ reference1 , reference2 ]
| |
+------+ |
↓ |
inner1 -> [100, 200] |
|
+--------------------+
↓
inner2 -> [100, 200]
你可以这样做
List<List<Integer>> outer = new ArrayList<List<Integer>>();
List<Integer> inner1 = new ArrayList<Integer>();
List<Integer> inner2 = new ArrayList<Integer>();
inner1.add(100);
inner1.add(200);
inner2.add(100);
inner2.add(200);
outer.add(inner1);
outer.add(inner2);
outer.get(0).add(300);
System.out.println(outer);