ITEEDU

尽可能避免创建对象(Object)

对象的创建并不是没有代价的。一个带有线程分配池的generational的内存管理机制会使创建临时对象的代价减少,不是分配内存总比不上不分配内存好。

如果你在一个用户界面的循环中分配一个对象,你不得不强制的进行内存回收,那么就会使用户体验出现稍微“打嗝”的现象。

因此,如果没有必要你就不应该创建对象实例。下面是一件有帮助的例子:

  • 当从原始的输入数据中提取字符串时,试着从原始字符串返回一个子字符串,而不是创建一份拷贝。你将会创建一个新的字符串对象,但是它和你的原始数据共享数据空间。
  • 如果你有一个返回字符串地方法,你应该知道无论如何返回的结果是StringBuffer,改变你的函数的定义和执行,让函数直接返回而不是通过创建一个临时的对象。

一个比较激进的方法就是把一个多维数组分割成几个平行的一维数组:

  • 一个Int类型的数组要比一个Integer类型的数组要好,但着同样也可以归纳于这样一个原则,两个Int类型的数组要比一个(int,int)对象数组的效率要高的多。对于其他原始数据类型,这个原则同样适用。
  •  如果你需要创建一个包含一系列Foo和Bar对象的容器(container)时,记住:两个平行的Foo[]和Bar[]要比一个(Foo,Bar)对象数组的效率高得多。(这个例子也有一个例外,当你设计其他代码的接口API时;在这种情况下,速度上的一点损失就不用考虑了。但是,在你的代码里面,你应该尽可能的编写高效代码。)

一般来说,尽可能的避免创建短期的临时对象。越少的对象创建意味着越少的垃圾回收,这会提高你程序的用户体验质量。