在循环中创建新对象的效率

10

我不确定这个问题是否与编程语言无关,所以我将这个问题作为Java问题提出。如果你有一个循环,像这样:

for (int i = 0; i < 9; i++) {
    Object obj = new Object;
    // fill object
    // do something with data
}

每次循环都会创建新的内存空间吗?如果是这样,旧的空间是否被处理掉了?如果不是,那么像这样做是否更有效率

Object obj = new Object;
for (int i = 0; i < 9; i++) {
    // fill object
    // do something with data
}

编辑:更新代码以更好地阐述问题。


我认为你不应该在堆上创建字符串。最好的方法是创建一个字符串变量,比如String object = null,这只是指向字符串的指针。每次迭代时,你都会在堆上创建字符串对象,这种方法比之前的方法更慢。希望这能帮到你。 - allthenutsandbolts
1
这两个循环完全做不同的事情。 - Louis Wasserman
1
已经有类似的问题了。 - PrimosK
我尝试查找@PrimosK,但没找到,感谢您的提醒。 - Steve
嗯?他提供的链接对我有效。 - user207421
@ejp 我的意思是在发问题之前我已经尝试过查找,链接对我也有效,谢谢。 - Steve
3个回答

9
简短回答:在Java开发中,忽略这些问题即可,因为大多数问题都是由JVM自身管理的黑盒子。
垃圾收集器会知道该做什么,并尝试根据情况做出最好的选择。
另外,您提供的特定示例对我来说没有太多意义...您可以进一步说明吗?

那么,我认为这个答案不适用于像C++这样没有垃圾回收机制的语言。 - Steve
1
不。在C++中也适用相同的答案。原则是在有足够证据表明值得付出努力之前,不要优化代码。(不幸的是,很多C/C++程序员忽略了这个原则...) - Stephen C
当你说忽略某些事情时,这意味着只需将对象创建放置在最合适的内部范围中,就像这里所示:https://dev59.com/YWoy5IYBdhLWcg3wCp3Q - Steve

7

“让垃圾收集器解决”这个基本答案是正确的,但你也应该明白这两个语句的影响:

String object = new String();
object = array[i];

第一步是创建一个新的(空)字符串,并将其赋值给“object”,接着赋值array[i]的值给“object”。

第二步的赋值覆盖了第一步所做的内容,因此你创建的第一个字符串从未被使用。垃圾回收器最终将回收存储空间,因此无需担心它会丢失,但这仍然是不必要的分配;你可以直接从String object = null;开始。

另外请注意,在Java中String是不可变的,因此一旦你分配了String对象,就不能更改其值,你只能使String变量引用一个新对象,但不能修改现有对象。


1

为什么不运行一些测试并观察结果呢?虽然垃圾回收器确实起作用,但你无法确定它是否达到了最佳效果。在处理大量数据时,这种情况可能会影响效率。

我认为这个链接可以帮助你追踪所需的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接