一、用法:

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的小白们共勉!

java中Stack的peek方法相关推荐

  1. Java中Stack栈的方法

    栈的特点就是先进后出, 后进先出,在Stack类中有五种方法 返回类型 方法名 描述 E push(E item) 将传入的值入栈的顶部 E pop() 返回栈顶的值,并删除栈顶的对象 E peek( ...

  2. Java中Stack详解

    前言 开发过程中经常会用到集合,在不用思考的情况下,集合我们肯定是用ArrayList,HashMap,特别点的时候会用到 HashSet.但是,这几个集合类真的是万能的么?针对不同的开发场景,我们需 ...

  3. 如何给女朋友讲明白:Java中Stack(栈)与Heap(堆)

    背景 Java中Stack(栈)与Heap(堆)是面试中被经常问到的一个话题. 有没有对Java中Stack(栈)与Heap(堆)烂熟于心的童鞋,请举手!!!(怎么没人举手-) 这个时候蜗牛哥的对象弱 ...

  4. java中的invoke方法_详解Java中Method的Invoke方法

    在写代码的时候,发现从父类class通过getDeclaredMethod获取的Method可以调用子类的对象,而子类改写了这个方法,从子类class通过getDeclaredMethod也能获取到M ...

  5. 在java中下列描述错误的是_在 JAVA 中 , 关于类的方法 , 下列描述错误的是 ()._学小易找答案...

    [多选题]价值的特性是 [简答题]输入任一字符串,统计其中数字,字母及其它字符个数 .(25分) [填空题]1.产品整体包括哪五个基本层次 2核心层次产品最基本的层次,是产品的_____ [单选题]纸 ...

  6. java中读取文件的方法

    总结一下java中读取文件的方法: 方法一(逐行的读取文件内容): private FileReader fileReader; private BufferedReader bufferedRead ...

  7. JAVA中线程同步的方法(7种)汇总

    JAVA中线程同步的方法(7种)汇总 同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法. ...

  8. Java中wait和sleep方法的区别

    1.两者的区别 这两个方法来自不同的类分别是Thread和Object 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁). wait ...

  9. 详细讲解Java中log4j的使用方法

    详细讲解Java中log4j的使用方法 作者: 网络 来源: 日期: 2008-1-3 23:40:24 1.Log4j是什么? Log4j可以帮助调试(有时候debug是发挥不了作 用的)和分析,要 ...

最新文章

  1. 【LeetCode 剑指offer刷题】树题6:28 对称二叉树(101. Symmetric Tree)
  2. JNI----Native本地方法接口
  3. 依赖管理和Maven
  4. 【牛客 - 303K第十五届浙江大学宁波理工学院程序设计大赛(同步赛)】Technology Tree(树形dp,tricks)
  5. HDU 1358 Period KMP
  6. DeFi借贷协议FLUX和比原链(BTM)达成全面战略合作协议,支持BTM借贷及挖矿
  7. Linux首次登陆设置root
  8. 史上最全使用Nexus搭建Maven服务器详细配置
  9. 《Adobe Premiere Pro CC经典教程》——6.2 节目监视器控件
  10. 文件指针以及文件的打开与关闭
  11. 批量生成MySQL不重复手机号大表
  12. 应用之星破除行业门槛 零成本开发手机应用
  13. cmdb 指南_无限供应商制造商指南
  14. 广州大学校园网路由器傻瓜式自助刷机教程
  15. 通过Servlet生成验证码图片
  16. DFM文件以及写该文章的原因等等
  17. 读书笔记:《图说区块链》
  18. idea的output窗口丢失问题
  19. 边缘计算(二)——边缘计算的类型与用途
  20. Linux命令之yum命令

热门文章

  1. SAMTOOLS安装
  2. 高级类特性-------抽象类
  3. 【Unity3D】XR: OpenVR Error! OpenVR failed initialization解决方案
  4. 开源灵活的邮件批量发送器
  5. 测试GUI自动排版,发图纪念
  6. 《Deep Learning》你需要知道的答案
  7. html桌面天干地支,天干地支
  8. python-httpx 发送http2.0时代请求
  9. sizzle编译函数
  10. 专用IP地址/私有IP地址