我总是想知道一件事,如果我有这样的方法:
String replaceStuff (String plainText) {
return plainText.replaceAll("&", "&");
}
它会一直为“&”创建新的String对象吗?和“&”被GC摧毁,然后通过下一次调用再次重新创建? 例如。 理论上做这样的事情会更好吗
final String A ="&";
final String AMP ="&";
String replaceStuff (String plainText) {
return plainText.replaceAll(A, AMP);
}
我认为这可能是一个比现实问题更具理论性的问题,我只是好奇如何在这方面处理内存管理。
答案 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