簡體   English   中英

Java中的字符串和內存分配?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM