List<List<Integer>> res = new ArrayList<>();
是创建一个 二维 ArrayList
(即一个嵌套列表)对象的声明和初始化。要详细理解这行代码,以及如何操作和填充它,需要了解一些概念。
1. List<List<Integer>>
的含义
List<List<Integer>>
表示一个 二维列表,即列表的元素也是列表。它可以用于存储二维数据结构,如二维矩阵或表格。ArrayList<>
是List
接口的一个实现类,提供了动态数组的功能。
2. 如何创建和初始化二维 ArrayList
2.1 创建二维 ArrayList
对象
当你使用 List<List<Integer>> res = new ArrayList<>();
时:
res
是一个空的ArrayList
,其中没有任何内部的List
元素。- 这行代码只初始化了外层
List
,并没有创建任何内层List
。
要填充 res
,还需要手动添加 ArrayList
实例到其中。
示例:
List<List<Integer>> res = new ArrayList<>(); // 创建外层列表
// 创建并添加内层列表
List<Integer> innerList1 = new ArrayList<>();
innerList1.add(1);
innerList1.add(2);
res.add(innerList1);
List<Integer> innerList2 = new ArrayList<>();
innerList2.add(3);
innerList2.add(4);
res.add(innerList2);
System.out.println(res); // 输出: [[1, 2], [3, 4]]
2.2 为什么 new ArrayList<>()
不能直接创建完整的二维数组结构?
new ArrayList<>();
只创建了外层列表,此时res
是一个空列表,没有任何内层元素。- 要创建一个完整的二维结构,必须手动为每个内层
List
实例化并添加到外层List
中。
3. 填充二维 ArrayList
的方法
3.1 手动填充
你可以逐一创建并添加内层 List
到 res
。
List<List<Integer>> res = new ArrayList<>();
for (int i = 0; i < 3; i++) {
List<Integer> innerList = new ArrayList<>();
for (int j = 0; j < 4; j++) {
innerList.add(j); // 填充内层列表
}
res.add(innerList); // 添加内层列表到外层列表
}
System.out.println(res); // 输出: [[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
3.2 使用初始化块
可以使用嵌套的 Arrays.asList()
方法来初始化二维列表。
List<List<Integer>> res = new ArrayList<>(
Arrays.asList(
new ArrayList<>(Arrays.asList(1, 2, 3)),
new ArrayList<>(Arrays.asList(4, 5, 6)),
new ArrayList<>(Arrays.asList(7, 8, 9))
)
);
System.out.println(res); // 输出: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
4. 常见问题与注意事项
4.1 添加内层 List
的引用
- 如果使用同一个内层
List
对象多次添加到外层List
中,修改内层List
会影响到所有引用它的地方。
List<List<Integer>> res = new ArrayList<>();
List<Integer> innerList = new ArrayList<>();
innerList.add(1);
res.add(innerList);
innerList.add(2);
res.add(innerList);
System.out.println(res); // 输出: [[1, 2], [1, 2]](两个引用指向同一个 `List` 对象)
解决方法:每次都创建新的 List
对象来避免引用问题。
4.2 初始化大小
- 可以使用
new ArrayList<>(initialCapacity)
为ArrayList
指定初始容量,但这仅影响它的容量而不是大小。 - 初始化后的二维
ArrayList
外层为空,必须手动添加内层List
。
5. 总结
List<List<Integer>> res = new ArrayList<>();
只初始化了外层ArrayList
,并没有创建内层的List
。- 内层
List
必须显式创建并添加到外层List
中。 - 直接使用
new ArrayList<>()
并不能填充二维结构,它只是一个容器的起点。 - 为了避免引用问题,每次添加内层
List
时应创建新的List
实例。