首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Joshua Bloch在Effective Java中使用2*size +1来调整堆栈的大小?

在Effective Java中,Joshua Bloch建议使用2*size + 1来调整堆栈的大小,这是因为这种调整方式可以有效地减少堆栈的重新分配次数,并提高性能。

首先,我们需要了解堆栈的基本概念。堆栈是一种数据结构,具有后进先出(Last-In-First-Out,LIFO)的特性。在Java中,堆栈通常用数组来实现。当堆栈中的元素数量超过数组大小时,需要对数组进行扩容操作。

Joshua Bloch提出的2*size + 1调整堆栈大小的方式是为了尽可能减少堆栈的重新分配次数。具体原因如下:

  1. 性能优化:堆栈的扩容操作涉及到数组的重新分配和数据的复制,这是一个相对耗时的操作。如果每次扩容都只增加固定数量的空间,那么堆栈的扩容次数会相对较多,导致性能下降。而使用2*size + 1的方式,每次扩容都会增加一定比例的空间,可以减少扩容次数,从而提高性能。
  2. 内存利用率:堆栈的空间利用率也是考虑的因素之一。如果每次扩容都只增加固定数量的空间,可能会导致堆栈的空间过大,浪费了内存资源。而使用2*size + 1的方式,可以根据实际需要动态调整堆栈的大小,提高内存利用率。

总之,Joshua Bloch在Effective Java中推荐使用2*size + 1来调整堆栈的大小,旨在提高性能和内存利用率。在实际开发中,可以根据具体情况进行调整,并结合性能测试和内存分析工具进行优化。

腾讯云相关产品推荐:Tencent Cloud CVM(云服务器),产品介绍链接地址:https://cloud.tencent.com/product/cvm

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么说“单元素的枚举类型已经成为实现Singleton的最佳方法”

预计阅读时间:10分钟 Joshua Bloch大神在《Effective Java》中明确表达过的观点:使用枚举实现单例的方法虽然还没有广泛采用,但是单元素的枚举类型已经成为实现Singleton...有,可以使用枚举的方式,Joshua Bloch大神也在《Effective Java》中明确支持此种方式,如下: public enum Singleton { INSTANCE;...不止简单,还成功避免了上述问题,而且能保证在反序列化的时候不会生成新的实例对象,以下是枚举方式反编译(使用javap命令)的字节码: javap Singleton.class Compiled from...如上,会报错,而且目前没有任何方法能绕过该限制,以下是jdk的newInstance方法的源代码,如果是ENUM类型则不允许使用反射(红色标注部分),看到这里大家应该明白为什么枚举方式能保证单例实例的安全...这种方式是Effective Java作者Josh Bloch 大神提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,所以极力大家写单例时使用此种方式 End

1.3K40

和 lvgo 一起学设计模式(一)创建型之单例模式

,而这个音效的大小有50M(假设),加载一次需要 2s ?左右的时间。你在测试的过程中发现,每次人物?‍...扯远了,我们要谈的还是单例的问题。缓存的内容其实就是对资源的合理利用,比如我们将一些大对象或者频繁的 IO 操作内容保存(缓存)在一个对象中。...依据:Joshua Bloch "Effective Java, Second Edition", p. 283-284 DCLSingleton current = dclSingleton...枚举(推荐使用) public enum EnumIvoryTower { /** * 实例 */ INSTANCE; } 这种方法是一个叫做 Joshua Bloch...优点:资源的合理分配和利用 缺点:违反了单一职责原则 简单说说 Joshua Bloch 《Effective Java》、Effective 系列图书作者。

37720
  • Java堆空间Vs栈内存

    方法结束后,该块将立即立即变为未使用状态,用作下一个方法使用。 与堆内存分配,栈内存的大小要小一点。 Java程序中的堆空间和栈内存分配 让我们用一个简单的程序来了解堆和交替的内存使用情况。...在第1行找到main()方法后,Java Runtime创建的堆内存将被main()线程中方法使用。 我们在第2行创建原始局部变量,因此将其创建并存储在main()方法的栈内存中。...如果您对Java编码技巧与实践更感兴趣,请阅读Joshua Bloch撰写的《Effective Java 中文 第三版》 ,这是值得深读的一本书。...堆内存由应用程序的所有部分使用,而堆栈内存仅由一个执行线程使用。 在内存中创建对象时,它始终存储在堆空间中,并存储到包含该对象的引用中。内存仅包含本地原始变量和堆空间中对象的引用变量。...堆中存储的对象可以分区访问,而其他线程则不能访问分区内存。 堆栈中的内存管理是以后进先出(LIFO)的方式完成的,而堆内存中的内存管理更复杂,因为它是全局使用的。

    1.2K20

    effective Java 创建和销毁对象篇

    小伙伴们好呀,我是 小羊 ,今天来和大家分享下 《Effective Java》这本书的 第2章 —— 创建和销毁对象 。一共有 9 点,一起看看叭~1....如果构造器有很多参数,建议用 builder 去创建对象这个就是 建设者模式 的使用了,下面是作者 Joshua Bloch 在 GitHub 仓库给的例子package effectivejava.chapter2...用 枚举或者私有构造器 来强化 单例属性这个就差不多在说 单例模式 了可以看看之前的文章: 一文带你看遍单例模式的八个例子,面试再也不怕被问了 (我都忘光了)这两个也是作者 Joshua Bloch 在...,可以看看 4ye 之前写的四种引用类型在Springboot中的使用 ,看看 Springboot 和线程池是如何巧妙用上 软引用和弱引用 的。...Joshua Bloch 的 GitHub 地址https://github.com/jbloch/effective-java-3e-source-code/tree/master/src/effectivejava

    27520

    计算机专业基础书籍推荐

    编辑:小虾米 夏沫 本文根据网上的参考资料以及自己的学习经验总结整理而成,旨在给大家做一个参考,希望大家在工作、学习中遇到相关的问题之后能从这些参考书中获得帮助。...Daniel Liang) 【译 者】戴开宇 【出版社】机械工业出版社 Effective Java中文版 【中文名】Effective Java中文版(第2版) 【英文名】Effective Java...(Second Edition) 【作 者】Joshua Bloch 【译 者】杨春花 / 俞黎敏 【出版社】机械工业出版社 Java程序员修炼之道 【中文名】Java程序员修炼之道 【英文名】..., and Corner Cases 【作 者】Joshua Bloch 【译 者】陈昊鹏 【出版社】人民邮电出版社 3 JVM 深入理解Java虚拟机 【作 者】周志明 【出版社】机械工业出版社...in Practice 【作 者】Brian Goetz / Tim Peierls / Joshua Bloch / Joseph Bowbeer / David Holmes / Doug Lea

    1.1K100

    Java中Array与ArrayList的10个区别

    Array和ArrayList都是Java中两个重要的数据结构,在Java程序中经常使用。...由于数组本质上是静态的,即一旦创建后就无法更改数组的大小,因此,如果需要一个可以调整自身大小的数组,则应使用ArrayList。这是Array和ArrayList之间的根本区别。...好了,您可以查看《Effective Java》中内容,在其中可以声明一个像E []这样的副本,然后使用类型转换。...如果您对Java编码技巧与实践更感兴趣,请阅读Joshua Bloch撰写的《Effective Java 中文 第三版》 ,这是值得深读的一本书。...尽管ArrayList确实提供了size()方法,该方法告诉给定时间点存储在ArrayList中的对象数量。size()始终与length不同,这也是ArrayList的容量。

    7.9K41

    Java的常量接口思考,项目中的常量是放在接口里还是放在类里呢?

    最近在看一本书 Java与模式,里面提了一句不建议使用常量接口,甚至举了个java源码的反例, 蛋疼的是没有说为什么? 查了网上一圈发现他们也是知道怎么做而不知道为什么这么做。...这个应该很少人遇到过,不过这是 Effective Java 里面说的。...Effective Java 作者 大佬的原话 According to Joshua Bloch, author of "Effective Java": The constant interface...第三 基于数据只暴露给相应的类的原则,一个类实现一个常量接口,可能只需要其中几个常量,而得到了更多无用的常量, 所以,使用常量接口的时候都是 import static const.valueAAA...总结 接口是定义类型的,而不应该用于导出常量。常量接口不建议使用,应使用常量类。

    2.2K11

    推荐给初级Java程序员的3本进阶书

    《Effective Java中文版》第二版 每个Java程序员的书桌上都应该放有这本书。...让我们先了解下作者: Joshua Bloch是Google公司的首席Java设计师,并且也是一位Jolt 奖获得者。...上面所有的问题(也包括其他74个)都有实用主义者Joshua Bloch的详细解释。读完这本书,程序员应该能意识到使用Findbugs、Checkstyle这些工具的必要性了。 ?...《Java并发编程实战》 一年前我正努力在做 UI 开发工作时(在Eclipse 插件中使用SWT/JFace,其他一些项目则使用Swing ),就看了这本书。...UI开发和多核系统应用开发是学习如何开发线程安全的软件系统的一个很好的理由。 这本书的作者如下:Brian Goetz,Joshua Bloch(又出现这位大牛了,我们刚提到过,还记得吗?)

    58410

    Java之父们 : James Gosling , Alan Kay,Bill Joy,Joshua Bloch,Rickard Oberg,Doug Lea,Rod Johnson,Kent Be

    Joshua Bloch : Java 2 元勋 文/莫映 早在1996年,适逢Java刚刚崭露头角,年内好事连连。...正是在Java技术如火如荼、大展拳脚的背景之下,Joshua Bloch来到了Sun,开始了他带领Java社区步入”迦南美地”的漫长历程。 很快,他被从安全组调入核心平台组,从事底层API设计。...Joshua对Java的贡献还不止于JDK,提起他的大作《Effective Java》(Addison Wesley, 2001),相信Java粉丝们一定耳熟能详。...该书对Java社群的影响,犹如C++社群中的《Effective C++》。Joshua对JCP的贡献也不小。...希望Joshua依然能继续”摩西未尽的事业”,以他的影响力推动Java社群继续前行。据称,《Effective Java》的下一版会加入Java 5.0的部分,让我们翘首以待吧。

    1.4K30

    两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

    Java对于eqauls方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,...当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降...补充:关于equals和hashCode方法,很多Java程序都知道,但很多人也就是仅仅知道而已,在Joshua Bloch的大作《Effective Java》(很多软件公司,《Effective Java...实现高质量的equals方法的诀窍包括:1. 使用==操作符检查"参数是否为这个对象的引用";2. 使用instanceof操作符检查"参数是否为正确的类型";3....不要将equals方法参数中的Object对象替换为其他的类型,在重写时不要忘掉@Override注解。

    1K20

    Java线程池的那些事

    熟悉java多线程的朋友一定十分了解java的线程池,jdk中的核心实现类为java.util.concurrent.ThreadPoolExecutor。...大家可能了解到它的原理,甚至看过它的源码;但是就像我一样,大家可能对它的作用存在误解。现在问题来了,jdk为什么要提供java线程池?使用java线程池对于每次都创建一个新Thread有什么优势?...直到前段时间我看到一篇Neal Gafter(和Joshua Bloch合著了《Java Puzzlers》,现任职于微软,主要从事.NET语言方面的工作)的访谈,里面有这么一段谈话(http://www.infoq.com...因为jvm会为每个线程分配一定内存(JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K,也可以通过jvm参数-Xss来设置),所以当线程数达到一定数量时就报了该error。...ThreadStackSize ThreadStackSize:线程栈的大小,JDK5.0以后每个线程堆栈大小默认为1M,以前每个线程堆栈大小为256K;可以通过jvm参数-Xss来设置;注意-Xss是

    73710

    java程序员必读书单

    Effective Java 尽管 Java 没有什么出色的入门书籍,但这不代表 Java 没有出色的必读书籍。...Effective Java 是我读过的最好的编程书籍之一,它包含大量的优秀Java编程实践,并对泛型和并发这两个充满陷阱的 Java 特性给出了充满洞察力的建议,以至于 Java 之父 James Gosling...深入理解 Java 虚拟机(第2版) 非常优秀且难得的国产佳作,系统的介绍了 Java 虚拟机和相关工具,并给出了一些调优建议; Java 程序员修炼之道 在这本书之前,并没有一本 Java 书籍系统详细的介绍...,以及如何编写正确的并发程序; Java Puzzlers 包含了大量的 Java 陷阱——以至于读这本书时我说的最多的一个词就是 WTF,这本书的意义在于它是一个 反模式 大全, Effective...更有意思的是,这两本书的作者都是 Joshua Bloch 。 软件开发者路线图 是一本优秀且实用的程序员职业规划手册。这本书由若干个模式组成,每个模式都对应于程序员职业生涯中的特定阶段。

    93740

    Java 单例模式 五种常见的写法

    * 同时,对singleton对象使用volatile关键字进行限制,保证其对所有线程的可见性,并且禁止对其进行指令重排序优化。 * 在单例中new的情况非常少,绝大多数都是可以并行的读操作。...因此在加锁前多进行一次null检查就可以减少绝大多数的加锁操作,执行效率提高的目的也就达到了 * 注意:双重检查锁法,不能在jdk1.5之前使用, * 而在Android平台上使用就比较放心了,一般...Java - Joshua Bloch](https://www.amazon.cn/dp/B01DPUXUWG/ref=sr_1_2?...ie=UTF8&qid=1486966767&sr=8-2&keywords=Effective+Java)提倡的方式, * 使用枚举,除了线程安全和防止反射强行调用构造器之外,还提供了自动序列化机制...* 因此,Effective Java 推荐尽可能地使用枚举来实现单例。 * 注意:枚举,虽然Effective Java中推荐使用,但是在Android平台上却是不被推荐的。

    56310

    NullPointerException:Attempt to Invoke a Method on a Null Object Reference完美解决方法

    通过丰富的代码示例和实用的技巧,帮助大家提升编程水平,避免这种异常的困扰。‍ 引言 在 Java 编程中,NullPointerException 是一种非常常见的运行时异常。...2. 代码检查和日志记录 在代码中添加适当的日志记录可以帮助跟踪变量的状态,尤其是在异常发生前。...答:最好的解决方法是: 详细检查异常堆栈跟踪,找到导致异常的具体代码行。 使用调试工具逐步排查代码,检查变量的状态和初始化情况。...小结 在本文中,我们详细探讨了 Java 中 NullPointerException 异常的定义、常见场景、检测与调试方法、解决最佳实践以及预防技巧。...参考资料 Java 官方文档 Effective Java(Joshua Bloch 著) Java Optional 类指南

    16810

    Java 设计模式(三)《单例模式》

    比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。...代码实践 Joshua Bloch, Effective Java 2nd Edition p.18 单元素枚举是使用单例模式最佳的实践....---- 典型应用 项目中记录日志的类 数据库连接 我们使用的操作系统的文件管理器 ---- 实际应用 java.lang.Runtime#getRuntime() java.awt.Desktop#getDesktop...() java.lang.System#getSecurityManager() ---- 结论 有类本身控制创建和销毁,违反了单一职责原则 鼓励使用全局共享实例,防止该对象使用的对象和资源被解除分配。...---- 参考文献 Design Patterns: Elements of Reusable Object-Oriented Software Effective Java (2nd Edition)

    36410
    领券