java中的不可变字符串?

时间:2012-05-31 10:35:57

标签: java string immutability

String s = "java";
s.substring(1); // ava

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

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

还有一个问题......如果我写了String s = new String("java"); //'java'不在字符串文字池中....

'ava'会在字符串文字池中吗?

3 个答案:

答案 0 :(得分:2)

  

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

新构造的String对象立即有资格进行垃圾回收。

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

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

在这两种情况下,文字"java"都会在池中。 (但在第二种情况下,s不会引用池中的"java"字符串,而是引用具有字符String的其他"java"字符串。)< / p>

答案 1 :(得分:1)

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

由于您没有将'ava'分配给任何对象,因此任何对象都没有指出'ava',因此它有资格进行垃圾回收。

2)'ava'会在字符串文字池中吗?

No it would be in string  literal pool.

答案 2 :(得分:0)

s.substring(1)创建一个新的String,指向s的基础char数组。这里要实现的重要一点是char数组在这两个对象之间共享。如果使用String(String)构造函数,则会创建包含引用字符的 new char数组。

如果您丢弃对s的引用,如果您引用了substring()操作的结果,那么您将引用完整底层字符数组

在您的示例中,您没有存储对新创建的String的引用。所以这将很快被垃圾收集。但是,s仍然引用了基础数组。