对于临时对象来说,尽管每个线程分配池的垃圾回收器仅用较小的代价创建出临时对象,但分配内存总是比不分配内存花更多代价。如果在一个用户界面中循环做分配对象操作,这样会产生一个定期的垃圾收集事件,使得界面会比较卡,影响用户体验。因此,应该避免创建对象实例。
一般来说,应该尽可能的避免创建短期的临时对象。越少的对象创建意味着越少的垃圾回收,这会提高程序的用户体验。
(1)代码流程的优化
例如可以在代码设计流程中减少不必要的对象生成,看下面的演示代码:
可以将生成Date()对象的语句放入if条件语句中,这样的话就可以有效减少不必要的对象生成。代码如下:
这样只有在if条件成立的时候才创建对象,避免了不必要的创建对象工作。
(2)对象在声明时的技巧
例如在使用Vector的过程中,经常声明一个Vector对象,但是不定义其初始大小。例如下面的演示代码:
这样做的弊端是Vector的内增长方法。当我们创建一个Vector对象时,当它的容量多于我们所声明的大小时,Vector会默认先生成一个两倍大小的新的Vector,然后再将原Vector中的内容复制一份到新Vector。这样做的后果导致了在垃圾回收时产生的性能问题。由此可见,除非万不得以,否则强烈建议在初始化时声明其大小,例如下面的演示代码:
(3)不要多次声明对象(www.daowen.com)
除非有充分的理由,否则不要多次声明对象。例如下面的演示代码:
此时编译器会自动为构造函数生成如下代码:
在默认情况下,任何事物都将被初始化为Public变量,初始化代码将被移动至构造函数中进行。所以,不要在构造函数之外进行初始化,正确的声明方式如下:
由此可见,在Android应用程序中如果没有需要就不应该创建对象实例。
当从原始的输入数据中提取字符串时,试着从原始字符串返回一个子字符串,而不是创建一份复制。这样你将会创建一个新的字符串对象,但是它和原始数据共享数据空间。
如果你已经有一个返回字符串地方法,你应该知道如何让返回的结果是StringBuffer。通过改变你的函数的定义和执行,让函数直接返回而不是创建一个临时的对象。 除此之外,还有一个比较激进的方法,就是把一个多维数组分割成几个平行的一维数组。
一个Int类型的数组要比一个Integer类型的数组要好,但着同样也可以归纳于这样一个原则,两个Int类型的数组要比一个(int,int)对象数组的效率要高的多。对于其他原始数据类型,这个原则同样适用。
如果你需要创建一个包含一系列Foo和Bar对象的容器时,两个平行的Foo[]和Bar[]要比一个(Foo,Bar)对象数组的效率高得多。这个例子也有一个例外,当设计其他代码的接口API时,在这种情况下,速度上的一点损失就不用考虑了。但是在代码里面,应该尽可能的编写高效代码。
由此可以总结道,应该尽可能的避免创建短期的临时对象。越少的对象创建意味着越少的垃圾回收,这会提高程序的用户体验质量。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。