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

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

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

还有一个问题...如果我会写String s = new String("java");// 'java' is not in string literal pool....

那么'ava'是否会在字符串文字池中?

4

3 回答 3

2

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

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

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

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

在这两种情况下,文字"java"都在池中。(但在第二种情况下,s不会指代"java"池中的字符串,而是指另一个String也有字符的字符串"java"。)

于 2012-05-31T10:37:54.123 回答
1

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

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

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

No it would be in string  literal pool.
于 2012-05-31T10:42:01.573 回答
0

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

如果你放弃对 的引用s,如果你有对substring()操作结果的引用,那么你就有对完整底层 char 数组的引用。

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

于 2012-05-31T10:37:50.737 回答