避免建立没必要要的对象(5)

一、不要每次都建立一个相同功能的新对象:数据库

  • 极端反例:每次在堆上建立一个对象,第一次会在常量池建立字符串新对象

  • 改进后:每次栈上建立引用,第一次会在常量池建立字符串新对象
  • 第一次指同一台虚拟机的第一次

二、静态工厂优于构造器的很重要缘由:安全

  • 构造器必须每次都建立新对象
  • 静态工厂则不必

举例:性能

使用静态初始化器改进后,性能大幅度提高:优化

  • final 静态域,会被做为常量使用
  • Calendar 建立代价很高
  • 能够进一步优化到延时初始化
  • 可是不建议:缘由是方法实现复杂、没法使性能显著 提升超过 现有水平

三、像适配器这样的场景,性能提高不明显对象

  • 适配器把功能委托给后备对象,为后备对象提供一个能够替代的接口
  • 不须要建立多个适配器实例

四、Map接口的 keySet() 方法每次都返回相同的 Set实例接口

  • 连续使用Map遍历时,能够考虑优化

五、自动封装内存

  • 容许基本类型和封装基本类型混用,自动装箱 拆箱
  • 两种类型语义上模糊,可是性能上差距明显
  • 优先使用基本类型,避免无心识的自动装箱
  • 每次往Long sum中添加 long 类型时,建立一个Long实例
  • 下述代码把 Long sum  改成long(基本类型)
  • 性能从40秒加,减小到6秒加

六、本条并没有 让咱们避免建立对象的意思字符串

  • 缘由是:小对象的建立和回收一般比较廉价
  • 并且,建立附加对象能提高代码的清晰性、简洁性和功能性
  • 是件好事

七、使用重量级对象时,才建议使用对象池虚拟机

  • 典型事例:数据库链接池
  • 轻量级对象池得不偿失:代码变乱、增长内存负担
  • JVM优化很容易使 不建立轻量级对象池的性能 优于 建立

八、保护性拷贝<39条>遍历

  • 在重用对象付出的代价远大于 建立新对象时,保护性拷贝
  • 没进行保护性拷贝,可能致使潜在错误或安全漏洞
相关文章
相关标签/搜索