我有一个已经初始化的字符串。现在我想用字符数组替换内容。我想知道是否执行以下操作:
stringObj = new String(charArr);
好吗?
这会导致任何内存泄漏吗?
抱歉,如果这个问题已经回答了,我根本找不到答案。
我有一个已经初始化的字符串。现在我想用字符数组替换内容。我想知道是否执行以下操作:
stringObj = new String(charArr);
好吗?
这会导致任何内存泄漏吗?
抱歉,如果这个问题已经回答了,我根本找不到答案。
当然,没关系。该引用引用了一个新字符串。旧的有资格获得 GC。
实习生和烫发空间有一些注意事项,但没有内存泄漏。这就是 Java 的工作原理。
您的代码不会受到这种构造的损害。注意最佳实践固然很好,但没有数据的过早优化是一场失败的游戏。尽你所能编写你的应用程序,如果性能不可接受,则对其进行分析,并修复对你的性能问题影响最大的问题。不要试图想象你知道问题出在哪里。
不用担心。垃圾收集器正在处理它!-> http://javarevisited.blogspot.co.at/2011/04/garbage-collection-in-java.html
由于字符串是不可变的,最终你会得到新的对象,它不会被以前的对象替换。对于这个例子,不会有内存泄漏,因为这只是一个字符串,但是如果你的应用程序是基于大量的字符串操作,这样做会有内存泄漏。您应该使用 StringBuffer 或 String Builder。
重要的是要了解您只更改了对字符串的一个引用。如果您有任何其他引用,它们仍然指向旧的 String 对象。这既会阻止垃圾收集,又会导致继续使用旧值。
特别是,如果您在作为参数传递 stringObj 的方法中执行此操作,则调用者的引用不受分配的影响。
换句话说 stringObj不是一个对象。它是一个指向对象的指针。您正在更改那个指针,使其指向一个新对象。
String stringobj = "This is fine";
stringobj = new String(charArray);
实际上,现在 stringobj 将包含包含新字符数组的内存位置的引用,并且之前的位置将由垃圾收集器处理。