如果堆栈为空,则将 stack.peek() 覆盖为 return null
Override stack.peek() to return null if the stack is empty
在Java中,如果在空栈上调用peek()
方法会抛出异常。
目前,为了解决这个问题,我必须在调用 peek()
.
之前检查堆栈是否为空
有没有办法覆盖 peek()
方法,以便在堆栈为空时 returns null
而不是抛出异常?
您可以对 java 中的任何非最终的 class 执行此操作。查找继承。
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 MyCustomStack<E> extends Stack<E> {
@Override
public synchronized E peek() {
if (isEmpty()) {
return null;
}
return super.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()
方法不仅在空的情况下 return null
,而且在单线程场景中也不是同步的,因此速度更快。
Deque<T> stack = new ArrayDeque<>();
stack.addFirst(element);
T element = stack.peekFirst();
如果堆栈被多个线程访问,我认为实现自己的并发堆栈应该更可取,如果容量固定则容易。
在Java中,如果在空栈上调用peek()
方法会抛出异常。
目前,为了解决这个问题,我必须在调用 peek()
.
有没有办法覆盖 peek()
方法,以便在堆栈为空时 returns null
而不是抛出异常?
您可以对 java 中的任何非最终的 class 执行此操作。查找继承。
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 MyCustomStack<E> extends Stack<E> {
@Override
public synchronized E peek() {
if (isEmpty()) {
return null;
}
return super.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()
方法不仅在空的情况下 return null
,而且在单线程场景中也不是同步的,因此速度更快。
Deque<T> stack = new ArrayDeque<>();
stack.addFirst(element);
T element = stack.peekFirst();
如果堆栈被多个线程访问,我认为实现自己的并发堆栈应该更可取,如果容量固定则容易。