Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的字符串和内存分配?_Java_Memory - Fatal编程技术网

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

java中的字符串和内存分配?,java,memory,Java,Memory,有一件事我一直想知道,如果我有这样的方法: String replaceStuff (String plainText) { return plainText.replaceAll("&", "&"); } 它会一直为“&”和“&”创建新的字符串对象吗?它们会被GC销毁,然后在下一次调用时重新创建吗? 例如。 从理论上讲,这样做会更好吗 final String A ="&"; final String AMP ="&";

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

String replaceStuff (String plainText) {
        return plainText.replaceAll("&", "&");
}
它会一直为“&”和“&”创建新的字符串对象吗?它们会被GC销毁,然后在下一次调用时重新创建吗? 例如。 从理论上讲,这样做会更好吗

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节中保证了这一点

字符串文字,或者更一般地说,作为常量表达式(§15.28)值的字符串,使用方法
String.intern
“interned”以共享唯一实例


第15.28节显示了+运算符作为一个操作包含,该操作可以从其他两个常量生成一个新常量。

不,它们是文本,因此会自动插入常量池

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

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

字符串的处理与GC处理的普通对象几乎没有什么不同。 例如,如果

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

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


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

它保证用于
Object y=“hello”
,但是
“he”+“llo”
的编译器优化也保证了吗?(我是问,不是挑战:-)@Sean:这也是保证。JLS第3.10.5节中提到:“字符串文字,或者更一般地说,作为常量表达式值的字符串(§15.28)-“interned”[…]”@Sean:assurable;我已经添加了引用。@Joachim:Yup,我添加了相同的引用:)实际上GC处理它们的方式并不不同,而是在构造过程中。值得注意的是,这是针对编译时字符串常量的。以其他方式创建的字符串不会自动插入。