String s = "java";
s.substring(1); // ava
考虑到字符串的不变性,编译器不会修改's'
但是会创建一个新对象,或者你可以说内存中有'java' as well as 'ava'
的空间。
这个'ava'
会发生什么,因为没有任何东西指向它或它没有被任何东西引用..
还有一个问题......如果我写了String s = new String("java");
//'java'不在字符串文字池中....
'ava'会在字符串文字池中吗?
答案 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
仍然引用了基础数组。