【问题标题】:Override stack.peek() to return null if the stack is empty如果堆栈为空,则覆盖 stack.peek() 以返回 null
【发布时间】:2021-02-16 11:23:55
【问题描述】:

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

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

【问题讨论】:

  • 您可以简单地扩展 Stack 并在您的自定义 Stack 中覆盖?

标签: java data-structures stack


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    public class OwnStack<E> extends Stack<E> {
        @Override
        public synchronized E peek() {
            int len = size();
            if (len <= 0) return null;
            return elementAt(len - 1);
        }
    }
    

    【讨论】:

      【解决方案3】:

      你可以对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();
      }
      

      【讨论】:

        【解决方案4】:

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

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

        如果堆栈由多个线程访问,我认为实现自己的并发堆栈应该是更可取的,如果容量是固定的,那么容易。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-04-29
          • 1970-01-01
          • 1970-01-01
          • 2014-11-21
          • 2014-04-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多