15

重複の可能性:
Java6とJava7で異なる動作をするintern()

このブログで私は面白い文字列パズルを見つけました:

- - 引用 - -

String te = "te", st = "st";
//"test".length();
String username = te + st;
username.intern();
System.out.println("String object the same is: " 
   + (username == "test"));

Java 7update7で印刷します。

String object the same is: true

ただし、「test」.length();のコメントを解除します。行、またはJava 6で実行すると、印刷されます

String object the same is: false

--- EoQ ---

正直なところ、出力が異なる理由がわかりません。そのような行動の原因を教えてください。

4

2 に答える 2

14

インターンされた文字列をユーザー名に割り当てる必要があります。

String username = te + st;
username = username.intern();

この場合、両方のコードが出力されますtrue

別の興味深い例を次に示します。

final String te = "te", st = "st";
"test".length();
String username = (te + st);
System.out.println("String object the same is: " + (username == "test"));

teとstはfinalとしてマークされているため、trueも出力します。したがって、usernameはコンパイル時定数になり、自動的にインターンされます。

編集

何人かの人々があなたのコードがJava6でfalseを出力することを指摘したように、その"test".length行がコメントアウトされていても。

これは、Java7で導入された変更の1つによるものです。

JDK 7では、インターンされた文字列はJavaヒープの永続的な世代では割り当てられなくなりましたが、代わりに、アプリケーションによって作成された他のオブジェクトとともに、Javaヒープの主要部分(若い世代と古い世代として知られています)に割り当てられます。 。

結果の1つは、投稿したコードの出力がJava 6と7で異なることです(バグレポートの下部にある例を参照してください)。

于 2012-09-05T09:31:14.700 に答える
5

元の文字列の参照を変更するString.intern()の回答を確認してください

変更されるのは文字列ではなく、変更される「テスト」に使用されるオブジェクトです。

したがって、あなたの場合、if"test"が最初に定義されます。つまり、最初に定義された場合、"test".length();次に"test"文字列プールにあるため、最初の結果はfalseです。

次に、 「test」if you comment this lineを呼び出した後、文字列プールに追加されます。次に、比較に使用しているものに、メソッドによって配置されたものと同じオブジェクトが割り当てられます。したがって、それはusername.intern();"test"username.intern();true

それで

Commented //"test".length(); -> True
Un Commented "test".length(); --> False
于 2012-09-05T09:31:03.980 に答える