提问人:Sophy Tao 提问时间:6/23/2023 最后编辑:ThisaruGSophy Tao 更新时间:6/23/2023 访问量:51
为什么 Integer 2D 数组的元素默认不为 null
Why the element of an Integer 2D array is not null by default
问:
我一直在尝试调试我的代码。如果有人能帮忙看一看,找出问题所在,将不胜感激!
为了便于理解,我在第 4 行声明了一个 2D 数组 Integer[][] 存储桶,在下面的 for 循环中,我为外部数组的一些索引赋值(因此我认为那些我没有赋值的索引应该是null
);
然后在第 1 行,我遍历了 2D 数组,并试图找到那些不为 null 的数组,这意味着我已经在上一个循环中为其赋值。但是,我得到了,因为有些情况不是,而是 null。bucket[i]
bucket[i][0]
NullPointerException
bucket[i]
null
bucket[i][0]
这是我的代码:
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> freqMap = new HashMap<>();
for(int num : nums)
freqMap.put(num, freqMap.getOrDefault(num, 0)+1);
Integer[][] bucket = new Integer[nums.length+1][1];
for(int key : freqMap.keySet()) {
int frequency = freqMap.get(key);
if (bucket[frequency] == null) {
bucket[frequency] = new Integer[1];
}
bucket[frequency][0] = key;
}
int[] res = new int[k];
int resIdx = 0;
for(int i = bucket.length-1; i>=0; i--) {
if(bucket[i] != null) {
System.out.println(i);
System.out.println(bucket[i][0]);
res[resIdx++] = bucket[i][0];
if(resIdx == k) return res;
}
}
return res;
}
我很困惑为什么会发生这些。我相信那不是,我在上一个循环中分配了非空值。请帮我理解,非常感谢!bucket [i]
null
答:
"...因此,我认为那些我没有赋值的索引应该是空的......”
否,如果您在声明期间指定了内部数组大小,则它将被初始化。
您可能正在考虑一个“锯齿状”数组,其中您没有指定内部数组大小。
Integer[][] bucket = new Integer[nums.length + 1][];
这将导致 if 条件匹配。
if (bucket[frequency] == null)
"...我遍历了 2D 数组并试图找到那些不为 null 的 bucket[i],这意味着我在上一个循环中为 bucket[i][0] 分配了值。但是,我得到了 NullPointerException,因为在某些情况下,bucket[i] 不是 null,但 bucket[i][0] 为 null。..."
令人困惑的是,除了内部数组元素 Integer 之外,内部数组 Integer[] 的内容也可以为 null。
因此,内部数组不是 null bucket[i],元素是 bucket[i][0]。
例如,请考虑以下事项。
topKFrequent(new int[] { 1, 2, 3, 4, 2, 3 }, 2);
bucket[0] = [null]
bucket[1] = [4]
bucket[2] = [3]
bucket[3] = [null]
bucket[4] = [null]
bucket[5] = [null]
bucket[6] = [null]
评论
Map
int[][]
Map