1、不要每次都创建一个相同功能的新对象:
- 极端反例:每次在堆上创建一个对象,第一次会在常量池创建字符串新对象
- 改进后:每次栈上创建引用,第一次会在常量池创建字符串新对象
- 第一次指同一台虚拟机的第一次
2、静态工厂优于构造器的很重要原因:
- 构造器必须每次都创建新对象
- 静态工厂则没必要
举例:
使用静态初始化器改进后,性能大幅度提升:
- final 静态域,会被作为常量使用
- Calendar 创建代价很高
- 可以进一步优化到延时初始化
- 但是不建议:原因是方法实现复杂、无法使性能显著 提高超过 现有水平
3、像适配器这样的场景,性能提升不明显
- 适配器把功能委托给后备对象,为后备对象提供一个可以替代的接口
- 不需要创建多个适配器实例
4、Map接口的 keySet() 方法每次都返回相同的 Set实例
- 连续使用Map遍历时,可以考虑优化
5、自动封装
- 允许基本类型和封装基本类型混用,自动装箱 拆箱
- 两种类型语义上模糊,但是性能上差距明显
- 优先使用基本类型,避免无意识的自动装箱
- 每次往Long sum中添加 long 类型时,创建一个Long实例
- 下述代码把 Long sum 改为long(基本类型)
- 性能从40秒加,减少到6秒加
6、本条并没有 让我们避免创建对象的意思
- 原因是:小对象的创建和回收通常比较廉价
- 而且,创建附加对象能提升代码的清晰性、简洁性和功能性
- 是件好事
7、使用重量级对象时,才建议使用对象池
- 典型事例:数据库连接池
- 轻量级对象池得不偿失:代码变乱、增加内存负担
- JVM优化很容易使 不创建轻量级对象池的性能 优于 创建
8、保护性拷贝<39条>
- 在重用对象付出的代价远大于 创建新对象时,保护性拷贝
- 没进行保护性拷贝,可能导致潜在错误或安全漏洞