[英]strings and memory allocation in java?
我一直想知道的一件事,如果我有這樣的方法:
String replaceStuff (String plainText) {
return plainText.replaceAll("&", "&");
}
它會一直為“&”和被GC銷毀的“&”創建新的String對象,然后在下一次調用時再次創建它嗎? 例如,理論上做這樣的事情會更好
final String A ="&";
final String AMP ="&";
String replaceStuff (String plainText) {
return plainText.replaceAll(A, AMP);
}
我認為這可能是一個比實際問題更多的理論問題,我只是很好奇在這方面如何處理內存管理。
否。字符串文字是固定的。 即使您從其他地方使用相等的文字(或其他常量),您仍然會引用相同的對象:
Object x = "hello";
Object y = "he" + "llo";
System.out.println(x == y); // Guaranteed to print true.
編輯:JLS在第3.10.5節中對此進行了保證
使用
String.intern
方法,對字符串常量(或更一般地說,是常量表達式的值(第15.28節)的字符串)進行“ interned”,以便共享唯一的實例。
15.28節顯示+運算符被包含為一個可以從其他兩個常量產生新常量的操作。
不,它們是文字,因此會自動插入常量池。
每次創建新字符串的唯一方法是:
String replaceStuff (String plainText) {
return plainText.replaceAll(new String("&"), new String("&"));
}
使用GC處理字符串與普通對象幾乎沒有什么不同。 例如,如果
字符串a =“ aaa”; 字符串a1 =“ aaa”;
現在,a和a1都將指向內存中的相同String值,直到任何值更改。 因此,內存中將只有1個對象。
另外,如果我們將'a'和'a1'更改為指向任何其他字符串,則字符串池中仍會保留值“ aaa”,並且在以后需要時由JVM使用。 字符串不是GC'd
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.