为什么 Integer 2D 数组的元素默认不为 null

Why the element of an Integer 2D array is not null by default

提问人:Sophy Tao 提问时间:6/23/2023 最后编辑:ThisaruGSophy Tao 更新时间:6/23/2023 访问量:51

问:

我一直在尝试调试我的代码。如果有人能帮忙看一看,找出问题所在,将不胜感激!

为了便于理解,我在第 4 行声明了一个 2D 数组 Integer[][] 存储桶,在下面的 for 循环中,我为外部数组的一些索引赋值(因此我认为那些我没有赋值的索引应该是null);

然后在第 1 行,我遍历了 2D 数组,并试图找到那些不为 null 的数组,这意味着我已经在上一个循环中为其赋值。但是,我得到了,因为有些情况不是,而是 null。bucket[i]bucket[i][0]NullPointerExceptionbucket[i]nullbucket[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

Java 多维数组 nullPointerException

评论

0赞 WJS 6/23/2023
在 StackOverflow 上将代码作为图像发布是不合适的。
0赞 Sophy Tao 6/23/2023
我已经编辑了我的帖子。很抱歉给您带来不便,因为我是 StackOverflow 的新手。并提前感谢您的任何帮助!
0赞 g00se 6/23/2023
顺便说一句,你使用 a btw 的动机是什么?频率的访问是否更容易,因为它们是 ?Mapint[][]Map

答:

0赞 Reilas 6/23/2023 #1

"...因此,我认为那些我没有赋值的索引应该是空的......”

否,如果您在声明期间指定了内部数组大小,则它将被初始化。

您可能正在考虑一个“锯齿状”数组,其中您没有指定内部数组大小。

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]

评论

0赞 Sophy Tao 6/23/2023
我不能投票,因为我没有足够的声誉。但非常感谢您的评论。如果我理解正确,因为我指定了内部数组的大小,这意味着我已经初始化了内部数组,因此它们不为空。我理解正确吗?谢谢吨!
0赞 Reilas 6/23/2023
@SophyTao,正确,内部数组不会为 null,尽管内部数组的元素或元素是 null。您正在考虑它是一个交错数组,其中,这将是 null。而且,没问题,很高兴它有帮助。
0赞 Sophy Tao 6/23/2023
再次感谢你。真的很感激!
0赞 Reilas 6/23/2023
@SophyTao,没有问题!