这是Joshua Bloch撰写的第6章第24页的有效Java第2版第2章的代码.

在他定义的pop方法中,他使用元素[ – size].我想知道他为什么使用–size,而元素[size–]应该返回相同的正确值?

public class Stack {

private Object[] elements;

private int size = 0;

private static final int DEFAULT_INITIAL_CAPACITY = 16;

public Stack() {

elements = new Object[DEFAULT_INITIAL_CAPACITY];

}

public void push(Object e) {

ensureCapacity();

elements[size++] = e;

}

public Object pop() {

if (size == 0)

throw new EmptyStackException();

return elements[--size];

}

/**

* Ensure space for at least one more element, roughly

* doubling the capacity each time the array needs to grow.

*/

private void ensureCapacity() {

if (elements.length == size)

elements = Arrays.copyOf(elements, 2 * size + 1);

} }

解决方法:

因为数组是基于0的索引.

想象一下,你有一个包含2个元素的堆栈.

所以堆栈的大小等于2,数组中有以下表示:

elements[0] = elem;

elements[1] = elem;

所以你需要在从堆栈中弹出elem之前减小大小,否则你将尝试弹出不存在的元素[2].因此在这种情况下使用中缀运算符.

return elements[--size];

相当于

size--;

return elements[size];

如果元素[size–];编写时,它会尝试弹出元素[2],然后将大小减小1.因此,每次要从堆栈中弹出元素时,都会抛出ArrayIndexOutOfBoundsException.

标签:java,stack,effective-java,pop

来源: https://codeday.me/bug/20190716/1478286.html

java 堆栈 pop_为什么Joshua Bloch在有效的java中减少pop方法中堆栈的“大小”值?...相关推荐

  1. 【JavaScript 教程】第六章 数组03— Stack :使用 Array 的push()和pop()方法实现堆栈数据结构...

    英文 | https://www.javascripttutorial.net/ 译文 | 杨小爱 在上节,我们学习了JavaScript Array length属性以及如何正确处理它,错过的小伙伴 ...

  2. 采访Java Collection的作者Joshua Bloch

    想必用Java的人都用过JDK的容器类吧,什么List, Set, Map啦.每天这些代码在全世界成千上万的JVM里面运行,每天数以万记的程序员在使用这些类.你知道这些这么cool的代码是谁写的吗?是 ...

  3. [转载] Java中如何在方法中return返回多个值

    参考链接: 用Java返回多个值 今天在学习Java,做编程题练练手的时候,看到了这一题.  本身题目难度不大,但是我在想题目要求返回两个值,return只能返回一个值,我该怎么来实现呢? 我想到了一 ...

  4. JAVA静态字段用法_如何使用javaassist 访问 静态字段及修改方法中的某一句话

    @ddatsh 你好,想跟你请教个问题: 我在使用javaassist的时候遇到点困难,不知如何解决. 一个类定义如下 public class A{ private static final Log ...

  5. java 加载中_Java 6类加载中更快的是什么?

    小编典典 Java 6编译器将预验证信息添加到类文件中 如果Java虚拟机实现曾经尝试对50.0版类文件执行通过类型推断的验证,则在通过类型检查的验证失败的所有情况下都必须这样做. 这意味着Java虚 ...

  6. 【Android 内存优化】Android 原生 API 图片压缩原理 ( 图片质量压缩方法 | 查找 Java 源码中的 native 方法对应的 C++ 源码 )

    文章目录 一. 图片质量压缩方法 二. 查找对应的 Native 方法源码 三. 分析 Bitmap.cpp 中动态注册 Native 方法 在博客 [Android 内存优化]图片文件压缩 ( An ...

  7. JAVA进阶教学之(Object类中的equals方法)

    public boolean equals(Object obj){return (this == obj); } 原始equals方法是判断两个对象的内存地址是否相等的(内存地址相等,保存的值也相等 ...

  8. 编写程序,使用一维数组,模拟栈数据结构。 要求: 1、这个栈可以存储java中的任何引用类型的数据。 2、在栈中提供push方法模拟压栈。(栈满了,要有

    代码 /*第一题:编写程序,使用一维数组,模拟栈数据结构.要求:1.这个栈可以存储java中的任何引用类型的数据.2.在栈中提供push方法模拟压栈.(栈满了,要有提示信息.)3.在栈中提供pop方法 ...

  9. Java必突-JVM知识专题(一): Java代码是如何跑起来的+类加载到使用的过程+类从加载到使用核心阶段(类初始化)+类加载的层级结构+什么是JVM的内存区域划分?Java虚拟机栈、Java堆内存

    前言: 该章节知识点梳理:本文主要是入门和了解jvm,不做深入 1.Java代码是如何运行起来的? 2.类加载到使用的过程? 3.验证准备和初始化的过程? 4.类从加载到使用核心阶段:初始化.类加载器 ...

最新文章

  1. 收集下阿里集团下的技术BLOG
  2. windbg学习.formats--转换成各种进制
  3. html设置窗口最小大小,调整HTML 5画布的大小以适应窗口
  4. 大数据之-Hadoop3.x_MapReduce_ReduceJoin案例TableBean---大数据之hadoop3.x工作笔记0129
  5. 气体管道管径及流量对照表_气体涡轮流量计的选型要点?
  6. 计算机网络协议是网民们签订的合同,关于网络协议,下列__________选项是正确的。A.是网民们签订的合同B.是计算机之间的相互通信需...
  7. 灵魂有香气的女子李筱懿|讲述女性自我成长的重要性
  8. 非因解读 | Multiplex immunofluorescnece-多重免疫荧光结合单细胞蛋白组技术探索肿瘤微环境
  9. python音频处理(持续更新)
  10. canvas绘制圆形头像
  11. 后台添加mp4 php,织梦后台编辑器增加MP4视频上传功能的方法
  12. 81.(cesium之家)cesium修改灰色背景(默认蓝色)
  13. Linux:查看主机显卡
  14. linux自带视频播放VLC,如何将VLC媒体播放器设置为默认视频播放器?
  15. VSCode 无法跳转到定义
  16. C语言程序设计第二版 甘勇, 李烨 , 卢冰
  17. skype客户端搜不到联系人解决办法
  18. 软件测试员需要学什么?
  19. Ubuntu16.04安装win10虚拟机
  20. 如何进入VMware Fusion虚拟机BIOS

热门文章

  1. 新作文杂志新作文杂志社新作文编辑部2022年第8期目录
  2. 小觅双目相机进行ROS标定
  3. 深耕核心技术·赋能数字化转型 ——大快搜索黑科技亮相2019(第四届)大数据产业生态大会,斩获多项大奖...
  4. springboot2 整合 rocketmq
  5. 一名测试工程师参与开源项目的经历
  6. 今天许多的家庭有计算机英语,用英语写我的家庭作文3篇
  7. redis 在备份报错修改vm.overcommit_memory
  8. Mac OS Catalina (10.15)下编译Redis Desktop Manager(RDM)
  9. 如果想进入IT行业工作,需要做准备吗?
  10. php 正则正负整数,JS正则表达式 验证 输入的是正负小数(保留3位小数)或者只能输入正负整数...