一、用法:
java里Stack的peek方法是返回栈顶的元素但不移除它。
但Stack的pop方法是会移除的。
二、原因剖析:
(1)这是JDK中的peek方法的源码
/**
* Looks at the object at the top of this stack without removing it
* from the stack.
*
* @return the object at the top of this stack (the last item
* of the <tt>Vector</tt> object).
* @throws EmptyStackException if this stack is empty.
*/
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
这是上述最后一行代码elementAt(len-1)方法的源码:
public synchronized E elementAt(int index) {
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
}
return elementData(index);
}
这是上述elementData(index)方法的源码:
E elementData(int index) {
return (E) elementData[index];
}
当看到elementData[index]时就会发现java里的栈的实现是用数组来实现的。再返回去看peek()方法的源码会发现只是把
数组的最后一个元素(就是栈顶)返回来了,而没有做删除。
(2)这是JDK中的pop方法的源码
/**
* Removes the object at the top of this stack and returns that
* object as the value of this function.
*
* @return The object at the top of this stack (the last item
* of the <tt>Vector</tt> object).
* @throws EmptyStackException if this stack is empty.
*/
public synchronized E pop() {
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}
这是removeElementAt(len-1)方法的源码
public synchronized void removeElementAt(int index) {
modCount++;
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " +
elementCount);
}
else if (index < 0) {
throw new ArrayIndexOutOfBoundsException(index);
}
int j = elementCount - index - 1;
if (j > 0) {
System.arraycopy(elementData, index + 1, elementData, index, j);
}
elementCount--; //注意这里是减减操作(- -),连在一起了,看不清
elementData[elementCount] = null; /* to let gc do its work */
}
上述的
removeElementAt(len-1)方法的源码中,倒数第二行的代码的地方是将数组中存放的个数减少一个,然后将最后一个元素
设置位null值。也就验证了pop是会移除最后一个元素(也就是栈顶元素)的。
三、总结
其实学习java过程中会有很多的困难,只要我们不怕艰难,勇敢的去阅读源码和注释,会发现也没有那么难。
坚持自己的梦想走下去,总会成功的!与学java的小白们共勉!