现在有这么一个需求,我现在需要实现一个可变的n*n的方阵,也就是说,他的行和列都可变,用ArrayList实现
先来看一下代码,看看会输出什么:
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<ArrayList<Integer>> al = new ArrayList<>();
for (int i = 0; i < 5; i++) {
add(al);
}
for (ArrayList<Integer> list : al){
System.out.println(list);
}
}
// 给矩阵添加一行一列
public static void add(ArrayList<ArrayList<Integer>> al) {
for (ArrayList<Integer> list : al){
list.add(0);
}
al.add(new ArrayList<>(al.size()+1));
}
}
按理说,我们期望的输出应该为:
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
而实际输出为:
[0, 0, 0, 0]
[0, 0, 0]
[0, 0]
[0]
[]
原因何在,这里就需要提到Java中ArrayList的size和cap的区别了
- 在Java中,cap指的是当前的容量,size指的是当前的大小
- 在Java中,是通过size判断是否索引越界的
new ArrayList<>(int);
里面的参数为cap,而非size
因此,如果要达到目的,应该将上述代码中的 add
方法改为如下:
public static void add(ArrayList<ArrayList<Integer>> al) {
for (ArrayList<Integer> list : al){
list.add(0);
}
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < al.size() + 1; i++) {
list.add(0);
}
al.add(list);
}
输出:
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
符合预期。
2 条评论
很高兴在找 cap 和 size 的区别时,看到博主的发文,但是仔细看博主的第一段代码本身就实现不了。二维表全0的操作,每次插入的新链表时没有伴随执行插入0的操作。
并不是size 和 cap 导致的问题