理论教育 如何最大限度地避免创建对象?

如何最大限度地避免创建对象?

时间:2023-06-19 理论教育 版权反馈
【摘要】:对象在声明时的技巧例如在使用Vector的过程中,经常声明一个Vector对象,但是不定义其初始大小。当我们创建一个Vector对象时,当它的容量多于我们所声明的大小时,Vector会默认先生成一个两倍大小的新的Vector,然后再将原Vector中的内容复制一份到新Vector。由此可以总结道,应该尽可能的避免创建短期的临时对象。

如何最大限度地避免创建对象?

对于临时对象来说,尽管每个线程分配池的垃圾回收器仅用较小的代价创建出临时对象,但分配内存总是比不分配内存花更多代价。如果在一个用户界面中循环做分配对象操作,这样会产生一个定期的垃圾收集事件,使得界面会比较卡,影响用户体验。因此,应该避免创建对象实例。

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

(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时,在这种情况下,速度上的一点损失就不用考虑了。但是在代码里面,应该尽可能的编写高效代码。

由此可以总结道,应该尽可能的避免创建短期的临时对象。越少的对象创建意味着越少的垃圾回收,这会提高程序的用户体验质量。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈