java中的字符串和内存分配?

时间:2011-08-08 09:13:52

标签: java memory

我总是想知道一件事,如果我有这样的方法:

String replaceStuff (String plainText) {
        return plainText.replaceAll("&", "&");
}

它会一直为“&”创建新的String对象吗?和“&”被GC摧毁,然后通过下一次调用再次重新创建? 例如。 理论上做这样的事情会更好吗

final String A ="&";
final String AMP ="&";

    String replaceStuff (String plainText) {
            return plainText.replaceAll(A, AMP);
    }

我认为这可能是一个比现实问题更具理论性的问题,我只是好奇如何在这方面处理内存管理。

3 个答案:

答案 0 :(得分:4)

没有。字符串文字是实习的。即使你在其他地方使用相等的文字(或其他常量),你仍然会引用同一个对象:

Object x = "hello";
Object y = "he" + "llo";

System.out.println(x == y); // Guaranteed to print true.

编辑:JLS在第3.10.5节

中对此进行了保证
  

字符串文字 - 或者更常见的是,作为常量表达式(第15.28节)值的字符串 - 是“实习”,以便使用方法String.intern共享唯一实例。

第15.28节显示了+运算符被包含在一个可以从另外两个常量产生新常量的运算中。

答案 1 :(得分:3)

不,他们是文字,因此会自动插入常数池。

每次创建新字符串的唯一方法是:

String replaceStuff (String plainText) {
   return plainText.replaceAll(new String("&"), new String("&"));
}

答案 2 :(得分:1)

GC处理的字符串与普通对象的处理方式差别不大。 例如,如果

字符串a =“aaa”; 字符串a1 =“aaa”;

现在,a和a1都会在内存中指向相同的String值,直到任何值发生变化。因此,内存中只有一个对象。

此外,如果我们将'a'和'a1'更改为指向任何其他字符串,则仍然会在字符串池中保留值“aaa”,如果需要,稍后将由JVM使用。该字符串不是GC'd