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