0

我有一个已经初始化的字符串。现在我想用字符数组替换内容。我想知道是否执行以下操作:

stringObj = new String(charArr);

好吗?

这会导致任何内存泄漏吗?

抱歉,如果这个问题已经回答了,我根本找不到答案。

4

5 回答 5

1

当然,没关系。该引用引用了一个新字符串。旧的有资格获得 GC。

实习生和烫发空间有一些注意事项,但没有内存泄漏。这就是 Java 的工作原理。

您的代码不会受到这种构造的损害。注意最佳实践固然很好,但没有数据的过早优化是一场失败的游戏。尽你所能编写你的应用程序,如果性能不可接受,则对其进行分析,并修复对你的性能问题影响最大的问题。不要试图想象你知道问题出在哪里。

于 2013-01-13T16:29:11.590 回答
0

不用担心。垃圾收集器正在处理它!-> http://javarevisited.blogspot.co.at/2011/04/garbage-collection-in-java.html

于 2013-01-13T16:30:33.043 回答
0

由于字符串是不可变的,最终你会得到新的对象,它不会被以前的对象替换。对于这个例子,不会有内存泄漏,因为这只是一个字符串,但是如果你的应用程序是基于大量的字符串操作,这样做会有内存泄漏。您应该使用 StringBuffer 或 String Builder。

于 2013-01-13T16:35:31.427 回答
0

重要的是要了解您只更改了对字符串的一个引用。如果您有任何其他引用,它们仍然指向旧的 String 对象。这既会阻止垃圾收集,又会导致继续使用旧值。

特别是,如果您在作为参数传递 stringObj 的方法中执行此操作,则调用者的引用不受分配的影响。

换句话说 stringObj不是一个对象。它是一个指向对象的指针。您正在更改那个指针,使其指向一个新对象。

于 2013-01-13T16:38:19.653 回答
0
String stringobj = "This is fine";

stringobj = new String(charArray);

实际上,现在 stringobj 将包含包含新字符数组的内存位置的引用,并且之前的位置将由垃圾收集器处理。

于 2013-01-13T16:59:07.903 回答