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();
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方法相关推荐
- Java中Stack栈的方法
栈的特点就是先进后出, 后进先出,在Stack类中有五种方法 返回类型 方法名 描述 E push(E item) 将传入的值入栈的顶部 E pop() 返回栈顶的值,并删除栈顶的对象 E peek( ...
- Java中Stack详解
前言 开发过程中经常会用到集合,在不用思考的情况下,集合我们肯定是用ArrayList,HashMap,特别点的时候会用到 HashSet.但是,这几个集合类真的是万能的么?针对不同的开发场景,我们需 ...
- 如何给女朋友讲明白:Java中Stack(栈)与Heap(堆)
背景 Java中Stack(栈)与Heap(堆)是面试中被经常问到的一个话题. 有没有对Java中Stack(栈)与Heap(堆)烂熟于心的童鞋,请举手!!!(怎么没人举手-) 这个时候蜗牛哥的对象弱 ...
- java中的invoke方法_详解Java中Method的Invoke方法
在写代码的时候,发现从父类class通过getDeclaredMethod获取的Method可以调用子类的对象,而子类改写了这个方法,从子类class通过getDeclaredMethod也能获取到M ...
- 在java中下列描述错误的是_在 JAVA 中 , 关于类的方法 , 下列描述错误的是 ()._学小易找答案...
[多选题]价值的特性是 [简答题]输入任一字符串,统计其中数字,字母及其它字符个数 .(25分) [填空题]1.产品整体包括哪五个基本层次 2核心层次产品最基本的层次,是产品的_____ [单选题]纸 ...
- java中读取文件的方法
总结一下java中读取文件的方法: 方法一(逐行的读取文件内容): private FileReader fileReader; private BufferedReader bufferedRead ...
- JAVA中线程同步的方法(7种)汇总
JAVA中线程同步的方法(7种)汇总 同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法. ...
- Java中wait和sleep方法的区别
1.两者的区别 这两个方法来自不同的类分别是Thread和Object 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁). wait ...
- 详细讲解Java中log4j的使用方法
详细讲解Java中log4j的使用方法 作者: 网络 来源: 日期: 2008-1-3 23:40:24 1.Log4j是什么? Log4j可以帮助调试(有时候debug是发挥不了作 用的)和分析,要 ...
最新文章
- 【LeetCode 剑指offer刷题】树题6:28 对称二叉树(101. Symmetric Tree)
- JNI----Native本地方法接口
- 依赖管理和Maven
- 【牛客 - 303K第十五届浙江大学宁波理工学院程序设计大赛(同步赛)】Technology Tree(树形dp,tricks)
- HDU 1358 Period KMP
- DeFi借贷协议FLUX和比原链(BTM)达成全面战略合作协议,支持BTM借贷及挖矿
- Linux首次登陆设置root
- 史上最全使用Nexus搭建Maven服务器详细配置
- 《Adobe Premiere Pro CC经典教程》——6.2 节目监视器控件
- 文件指针以及文件的打开与关闭
- 批量生成MySQL不重复手机号大表
- 应用之星破除行业门槛 零成本开发手机应用
- cmdb 指南_无限供应商制造商指南
- 广州大学校园网路由器傻瓜式自助刷机教程
- 通过Servlet生成验证码图片
- DFM文件以及写该文章的原因等等
- 读书笔记:《图说区块链》
- idea的output窗口丢失问题
- 边缘计算(二)——边缘计算的类型与用途
- Linux命令之yum命令