java中Stack的peek⽅法
⼀、⽤法:
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();
java中index是什么意思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的⼩⽩们共勉!