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

文字列の不変性を考慮すると、コンパイラは変更せずに新しいオブジェクトを作成するか、メモリ's'内にスペースがあると言えます。'java' as well as 'ava'

'ava'も指していないか、何も参照されていないため、 this はどうなりますか..

もう 1 つの質問... String s = new String("java");// 'Java' は文字列リテラル プールにありません....

その場合、「ava」は文字列リテラルプールにあるでしょうか?

4

3 に答える 3

2

何も指していないか、何も参照されていないため、この「ava」はどうなりますか..

新しく構築されたStringオブジェクトは、すぐにガベージ コレクションの対象になります。

2 番目の質問については、文字列リテラル プールに関する限り、次の 2 つの式に違いはないと思います。

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

どちらの場合も、リテラル"java"はプール内にあります。(しかし、2 番目のケースでは、プール内にある文字列をs参照するのではなく、文字も含む別の文字列を参照します。)"java"String"java"

于 2012-05-31T10:37:54.123 に答える
0

s.substring(1)Stringの基になる char 配列を指す新しいを作成しsます。ここで重要なことは、これら 2 つのオブジェクト間で char 配列が共有されていることです。String(String)コンストラクターを使用すると、参照された文字を含む新しいchar 配列が作成されます。

への参照を破棄した場合、操作sの結果への参照がある場合は、基になる完全な char 配列への参照があります。substring()

あなたの例では、新しく作成された文字列への参照を保存していません。そのため、ガベージコレクションは非常に迅速に行われます。sただし、基になる配列は引き続き によって参照されます。

于 2012-05-31T10:37:50.737 に答える