5

重複の可能性:
Java 6 と Java 7 での intern() の動作の違い

この質問の例を実行しながら

method onintern()を呼び出すと、メソッドの奇妙な動作に気付きました。その後、 Original Stringに operator を使用できます。intern()String==

メソッドの JavaDoc intern():

文字列オブジェクトの正規表現を返します。最初は空である文字列のプールは、クラス String によってプライベートに維持されます。

intern メソッドが呼び出されたときに、メソッドによって決定されたこの String オブジェクトと等しい文字列がプールに既に含まれている場合は、プールequals(Object)からの文字列が返されます。それ以外の場合は、この String オブジェクトがプールに追加され、この String オブジェクトへの参照が返されます。

したがって、任意の 2 つの文字列sおよびtについて、s.intern() == t.intern()が true である場合にのみ true となりs.equals(t)ます。

上記のJavadocは、元の文字列が変更されるとは言っていません。では、なぜこのプログラムは入力がokayいつなのかを出力testします。

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner user_input = new Scanner(System.in);
        String username;
        System.out.print("username: ");
        username = user_input.next();
        // Even if I do not assign returned string for comparison still it compares
        // okay else it does not compare
        username.intern();
        if (username == "test") {
            System.out.println("okay");
        }
        else {
            System.out.println("not okay");
        }
    }
}
4

3 に答える 3

3

String.intern()は、intern()された文字列を返します。これは、メソッドが渡された参照を変更できないためです。

それで、テストが入力であるときにこのプログラムが正常に出力されるのはなぜですか。

この文字列が初めて表示されるのはintern()された文字列であり、「test」の1つの文字列リテラルになるため、正常に出力されます。変更されるのは文字列ではなく、変更される「テスト」に使用されるオブジェクトです。

代わりに試してください。

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: test

ただし、これをJava 6 update 32で実行するか、行のコメントを解除して、「テスト」が最初に表示され、取得できるようにします。

String object the same is: false
于 2012-09-05T07:21:55.963 に答える
2

str.intern() は、同じオブジェクトが String プールに既に存在するかどうかを確認し、存在する場合はそれを再利用します。

于 2012-09-05T06:37:06.010 に答える
0

以下の行は、入力フォームのユーザーを示しています。

    username = user_input.next();

その後 、条件ステートメント username.intern();で Now の文字列リテラルを返す呼び出しを行っていますusername

if (username == "test") 

あなたの変数usernameには文字列プールからの文字列リテラルオブジェクトが含まれており"test"、文字列リテラルでもあるため、jvm は、 その手段testのために既に作成されており、同じオブジェクトである文字列の同じ参照を提供します。そして、Javaではオブジェクトのチェック参照を操作しているため、この場合はそれが返される ため、その印刷が 行われますusernameusername"test"==trueokay

于 2012-09-05T06:57:11.983 に答える