Effective Java (5) 避免创建不必要的对象
2014-07-16 21:06
274 查看
创建对象有时候是比较昂贵的操作,比如创建数据库连接池。现代虚拟机对于轻量级对象的创建相对而言则简单许多。但无论创建对象的成本是否高昂,都应该避免创建不必要的对象。
有几种创建对象的反模式,都是因为创建不必要对象引起的。
首先是大多数人都知道的创建字符串:
其次是java.util.Calendar对象:
如果useCalendar调用很频繁,建议将对象抽提成为域变量,省去每次创建Calendar 的实例的麻烦。毕竟Calendar实例的创建也是一个比较重的操作。
第三种反模式和自动个装箱有关:
这里第三行 sum += i;实际上做了这样的操作:
最后有一点需要提及,避免创建不必要的对象并不代表尽量不要创建对象。特别是不要为了尽量不创建对象而人为的编写一些对象池。JVM已经发展到了可以很好的处理轻量级对象的程度,过分追求对象复用,使用对象池之类的技术,会同时带来一些其他方面的问题,比如控制对象池资源回收、增加代码复杂度等,反而得不偿失。
有几种创建对象的反模式,都是因为创建不必要对象引起的。
首先是大多数人都知道的创建字符串:
String s = new String("new string")
其次是java.util.Calendar对象:
public class WrongCalendar{ public void useCalendar(){ Calendar cal = cal.getInstance(); ... } }
如果useCalendar调用很频繁,建议将对象抽提成为域变量,省去每次创建Calendar 的实例的麻烦。毕竟Calendar实例的创建也是一个比较重的操作。
第三种反模式和自动个装箱有关:
Long sum = 0L; for(long i =0;i < Integer.MAX_VALUE;i++){ sum += i; } System.out.println(sum);
这里第三行 sum += i;实际上做了这样的操作:
Long tmpI = new Long(i); sum += i;于是Integer.MAX_VALUE次循环就创建了相同次数的Long对象,不知不觉中极大的降低了程序的效率。这也提醒我们,如果无法确定自动装箱是否适用,尽量适用原始类型进行运算。
最后有一点需要提及,避免创建不必要的对象并不代表尽量不要创建对象。特别是不要为了尽量不创建对象而人为的编写一些对象池。JVM已经发展到了可以很好的处理轻量级对象的程度,过分追求对象复用,使用对象池之类的技术,会同时带来一些其他方面的问题,比如控制对象池资源回收、增加代码复杂度等,反而得不偿失。
相关文章推荐
- Effective Java 第三版——6. 避免创建不必要的对象
- 《Effective Java》避免创建不必要的对象
- 《Effective Java》读书笔记04--避免创建不必要的对象
- Effective Java 第5条:避免创建不必要的对象
- Effective Java 第5条 避免创建不必要的对象
- Effective Java 2.5——避免创建不必要的对象
- 《Effective java》读书记录-第5条-避免创建不必要的对象
- 《Effective java》读书笔记1——避免创建不必要的对象
- Effective Java - 创建和销毁对象 - 避免创建不必要的对象
- Effective Java 第五条:避免创建不必要的对象
- 创建和销毁对象——避免创建不必要的对象——重用不可变对象(摘自Effective java)
- 【Effective Java】Ch2_创建销毁对象:Item5_避免创建不必要的对象
- Android 编码规范:(五)避免创建不必要的对象
- Java学习笔记5:避免创建不必要的对象
- Java学习笔记5:避免创建不必要的对象
- Android 编码规范:(五)避免创建不必要的对象
- Android 编码规范:(五)避免创建不必要的对象
- Effective Java学习笔记之第5条 避免创建不必要的对象
- 避免创建不必要的对象
- 第5条:避免创建不必要的对象