繁体   English   中英

如果堆栈为空,则覆盖 stack.peek() 以返回 null

[英]Override stack.peek() to return null if the stack is empty

在 Java 中,如果在空堆栈上调用peek()方法,则会引发异常。 目前,为了解决这个问题,我必须在调用peek()之前检查堆栈是否为空。

有没有办法覆盖peek()方法,以便它在堆栈为空时返回null而不是抛出异常?

我认为您可以像这样简单地扩展自己的堆栈版本:

public class MyCustomStack<E> extends Stack<E> {
    @Override
    public synchronized E peek() {
        if (isEmpty()) {
            return null;
        }
        return super.peek();
    }
}

您可以使用任何在 Java 中不是 final 的类来执行此操作。 查继承。

public class HackedStack<E> extends Stack<E> {
    @Override
    public E peek() {
       //do your thing
    }
}

尽管您可以通过使用 stack#empty https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html#peek()完全避免这种情况

public void loop() {
   Stack<String> stack = new Stack<>();
   while (!stack.empty()) stack.peek();
}
public class OwnStack<E> extends Stack<E> {
    @Override
    public synchronized E peek() {
        int len = size();
        if (len <= 0) return null;
        return elementAt(len - 1);
    }
}

如果堆栈由单个线程访问,则应使用Deque 它的peek()方法不仅在空情况下返回null ,而且它也不同步,因此在单线程场景中速度更快。

Deque<T> stack = new ArrayDeque<>();
stack.addFirst(element);
T element = stack.peekFirst();

如果堆栈由多个线程访问,在我看来,实现自己的并发堆栈应该更可取,如果容量固定,则很容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM