下面哪个代码片段在时间上更有效
Class Test{...}局部变量
private void function(){
Test test = new Test();
....
}全局变量
Test test = null;
private void function(){
if(test == null){
test = new Test();
}
}让假设函数()经常调用
编辑
你们都很好。回答得很好。现在我要说的是
CASE-1比CASE-2更高效,但另一方面,CASE-1并不是线程安全的。所以两者都有利与弊
。
发布于 2015-03-06 06:08:24
在案例1中,会创建一个Test,并在每次调用时都有资格使用GC,这会产生大量的垃圾。在第二种情况下,它只创建一次,可能永远不是GCed。
为什么我们不总是使用选项2-它可能不是线程安全。让我们用SimpleDateFormat代替Test,而函数()将需要同步,否则它将无法在多线程应用程序中工作。同步也很昂贵。因此,我们需要决定哪一个选项是更好的新对象,每次或同步。
发布于 2015-03-06 06:03:36
如果构造函数有副作用,则两个选项执行两种不同的操作。
如果Test携带状态,则选项1和选项2也可能不再等效(选项2可能不是线程安全的)。
例如:许多人错误地使用Java的日期或数字格式对象(如选项2 ),这不太好,因为它们不是线程安全。
假设Test完全无状态,并且调用构造函数没有任何副作用(这两者您似乎都有暗示),那么选项3如何:
private static final Test test = new Test();
private void function(){
.....
}根本没有GC活动。
或者,如果Test确实携带状态,或者在某种程度上不具有线程安全性,并且您希望在一个紧循环中调用function,则选项4:
private void function(Test test){
}
void theCaller(){
Test test = new Test();
for (int i=0; i<10000; i++) {
function(test);
}
}由于该方法是private,所以您可以使用一种不太方便的方式以性能的名义调用它。
发布于 2015-03-06 06:02:32
这取决于函数的使用和对象在问题集中要做什么。我总是说,只有在需要的时候才创建对象。没有理由让一个物体不被使用。如果您计划在函数之外使用该对象,您将希望首先将其初始化为null,然后在需要时创建该对象。
您不应该担心Java的垃圾收集效率。很有效率。只要你没有在100年代的时候创造出更多的动态对象,我就不会担心了。
https://stackoverflow.com/questions/28893109
复制相似问题