遍历 ArrayList:for 循环中的 if 语句被完全忽略

Iterating through an ArrayList: if statement within for loop is completely ignored

class MyCircularQueue {
    
    ArrayList<Integer> CirQueue;
    
    public MyCircularQueue(int k) {
        CirQueue = new ArrayList<Integer>(k);
        
    }
    public boolean isFull() {
        for(int s=0; s<this.CirQueue.size(); s++) {
            if (this.CirQueue.get(s) == null) {
                return false;
            }
        }
        return true;
    }
    
}

如果 CirQueue 中的任何索引为空,isFull() 方法想要 return false。如果它在不触发 if 语句的情况下遍历整个 CirQueue ArrayList,它希望 return 为真。然而,当我调试我的方法时,(在通过构造函数初始化 ArrayList 之后)在 if 语句处设置断点后, 编译器将读取 for 循环 header,然后完全跳过 if 语句只是 return 正确。 为什么会发生这种情况?

带有int参数的ArrayList构造函数“构造一个具有指定初始容量的空列表”(docs)。这意味着您已经保留了一些 space,但列表仍然是空的,size() 将产生 0,并且没有任何可迭代的内容。

虽然你在构造函数中初始化了CirQueue的大小,但是你并没有添加元素。也就是说,ArrayList构造函数ArrayList(int)只是声明了一个Integer数组,并没有赋值给它。 我在JShell中测试,CirQueue为空(容量为0,值为[]),你应该用null填充,这样你就不会为空。

由于您使用的是 ArrayList,因此无需使用大小 k 启动它,只需在构造函数中启动一个空的 ArrayList,- 您仍然可以使用您的实现。

 public MyCircularQueue() {
    CirQueue = new ArrayList<Integer>();   
}

ArrayList 具有 Integer 对象,因此您无需在启动时决定大小。然后你可以继续你的 isFull() 代码。你仍然有一个空的 ArrayList。所以你可以在遍历之前先检查 ArrayList 是否为空。但是,即使您使用您没有对象的大小初始化 ArrayList。您应该有要迭代的对象。