Java队列错误

Java队列错误,java,list,queue,Java,List,Queue,我一直收到错误:线程主java.lang.IndexOutOfBoundsException中的异常:索引:2,大小:2。当我按下一个值后弹出并偷看时,它会显示null。当我从一个空队列中弹出/偷看时,它会给我错误信息。这不是将artay list与队列一起使用的正确方法吗 public T peek() { if(isEmpty()) throw new RuntimeException("Can't peek here

我一直收到错误:线程主java.lang.IndexOutOfBoundsException中的异常:索引:2,大小:2。当我按下一个值后弹出并偷看时,它会显示null。当我从一个空队列中弹出/偷看时,它会给我错误信息。这不是将artay list与队列一起使用的正确方法吗

 public T peek()
        {
            if(isEmpty())
                throw new RuntimeException("Can't peek here");

            return value.get(value.size()-1););
        }

public T pop()
    {
        if(isEmpty())
            throw new RuntimeException("Can't pop here");

        T number = value.get(begin);
        value.set(begin, null);
        //value.remove(value.size()-1);

        begin++;
        return number;
    }
在开始之后,立即将其设置为null。当您将begin设置为null时,还将number设置为null,因为number和begin引用同一个对象

从队列弹出的正确方式如下所示:

参考第一项 从列表中删除项目 返回引用 在代码中,它看起来像这样。对于我的示例,我假设该值是您的ArrayList。也许值是一个比较容易混淆的名称

T number = value.get(0); // Reference the first item
value.remove(0) // Remove it from the list
return number; // Return the reference
在执行这些操作之前,应该检查列表是否为空

if(val.size() > 0) {
    // Do Stuff
} else {
    throw CannotPopFromAnEmptyQueueException();
}

值得一提的是,当谈论队列时,pop不是一个好术语。排队和退队是更正式的术语。Pop和push是堆栈术语。

在第一次Pop/peek之后,队列中有一个元素的值等于null

PSB代码摘录:

T number = value.get(begin);
value.set(begin, null);
//value.remove(value.size()-1);

begin++;
在第一次迭代中,begin将等于0。因此,您正在执行类似value.set0、null和begin++的操作,所以现在begin=1


因此,当您下次执行pop/peek时,您实际上尝试获取索引1中不存在的元素,因此您将获得此indexOutOfBoundException。

确切地说,您不应该这样递增。在您的情况下,您可能可以检查arraylist的大小,并确保begin计数器在增量后不会超过该大小。