java中的不可变字符串?

java中的不可变字符串?,java,string,immutability,Java,String,Immutability,考虑到字符串的不变性,编译器不会修改's',而是创建一个新对象,或者您可以说内存中有空间存放'java'和'ava' 这个'ava'会发生什么,因为没有任何东西指向它,或者它没有被任何东西引用 还有一个问题。。。如果我写的是strings=newstring(“java”)/“java”不在字符串文字池中 “ava”是否在字符串文字池中?s。子字符串(1)创建一个新的字符串,指向s的底层字符数组。这里需要意识到的重要一点是,char数组在这两个对象之间是共享的。如果使用String(String

考虑到字符串的不变性,编译器不会修改
's'
,而是创建一个新对象,或者您可以说内存中有空间存放
'java'和'ava'

这个
'ava'
会发生什么,因为没有任何东西指向它,或者它没有被任何东西引用

还有一个问题。。。如果我写的是
strings=newstring(“java”)/“java”不在字符串文字池中

“ava”是否在字符串文字池中?

s。子字符串(1)
创建一个新的
字符串,指向
s
的底层字符数组。这里需要意识到的重要一点是,char数组在这两个对象之间是共享的。如果使用
String(String)
构造函数,将创建一个包含引用字符的新字符数组

String s = "java";
String s = new String("java");
如果丢弃对
s
的引用,如果引用了
substring()
操作的结果,则引用了完整的底层字符数组

在您的示例中,您没有存储对新创建的字符串的引用。所以垃圾会很快被收集起来。但是,底层数组仍然由
s
引用

这个“ava”会发生什么,因为没有任何东西指向它,或者它没有被任何东西引用

新构造的
String
对象立即可以进行垃圾收集

关于第二个问题,我认为就字符串文字池而言,以下两个表达式之间没有任何区别:

String s = "java";
s.substring(1); // ava
在这两种情况下,文本
“java”
将在池中。(但在第二种情况下,
s
不会引用池中的
“java”
字符串,而是引用另一个
字符串,该字符串也包含
“java”

1)这个“ava”会发生什么情况,因为没有任何东西指向它或它没有被任何东西引用

由于您没有将“ava”分配给任何对象,这意味着“ava”没有被任何对象指向,因此它有资格进行垃圾收集

2) “ava”是否会在字符串文本池中

String s = "java";
String s = new String("java");

... 但是,考虑到字符串的不变性,这必须是一个实现细节。文本池中唯一的字符串是在类文件中以双引号特别提到的字符串--
“java”
本身,例如--;字符串b=新字符串(“aaa”);--->这将创建一个字符串文本“aaa”的新实例作为一个单独的对象,并将其与另一个“aaa”一起放入池中。我想我在某处读到,使用new关键字创建的字符串不会进入字符串文本池。。。“这不对吗?”路易斯瓦瑟曼:只是澄清一下。由常量表达式生成的字符串位于池中。这些字符串包括文字字符串(例如,
“java”
),以及其他常量表达式的结果字符串(例如,
“ja”+“va”
)。但这些并不是池中唯一的字符串。许多标识符也找到了它们的方法(例如,
C.class.getSimpleName().equals(“C”)
是真的)。@rd4code:这是正确的。一个在游泳池里;另一个不是。把
newstring(“java”)
看作
strings1=“java”的缩写;字符串s2=新字符串(s1)然后
s1
在池中
s2
s1
的副本(不在池中)。字符串a=“aaa”可能重复;字符串b=新字符串(“aaa”);--->这将创建一个字符串文本“aaa”的新实例作为一个单独的对象,并将其与另一个“aaa”一起放入池中