-3

Javadoc によると、文字列プールに等しい文字列がある場合、intern() メソッドはその文字列を返します。

public class Demo {
public static void main(String[] args) {
    String str1 = "Apple";
    String str2 = new String("Apple");

    System.out.println(str1.intern() == str2); //false
    System.out.println(str1 == str2.intern()); //true
} 
}

どちらの場合も真実になると思っていました。

4

3 に答える 3

2
 System.out.println(str1.intern() == str2); //false

上記の場合、インターンされた文字列"Apple"の参照と、ヒープ上にある別の文字列の参照の参照を比較しています (ただし、値は同じです)。したがって、結果は「偽」です。

System.out.println(str1 == str2.intern()); //true

上記の場合、文字列定数プールの参照を、文字列定数プールに「Apple」を追加しようとして取得した参照と比較しています。「Apple」はすでに最初の行にあるため、このインターンは str1 が指すオブジェクトを返します。したがって、あなたは真実になります。

PS : この動作はjavadocで説明されています

于 2016-11-21T09:35:32.623 に答える
0

String.intern()メソッドは、定数プールにheap Stringオブジェクトの正確なコピーを作成するために使用されます。定数プール内のStringオブジェクトは自動的にインターンされますが、オブジェクトはそうではありませんString objectsStringStringheap

System.out.println(firstString.intern() == secondString);//false because it will fetch exact copy of the string compare in string

System.out.println(firstString == secondString.intern());//True because it will compare firstString with fetch the second String it will check heap or not
于 2016-11-21T09:57:37.710 に答える
0

これstr1.intern()を行っても、あなたの試みには何ももたらされません...str1はリテラル文字列であるため (すぐに文字列プールに配置されます)、str2ヒープに割り当てられている と比較しています...

したがって

System.out.println(str1.intern() == str2); 

が 出力さfalseれます。攪拌プール内の文字列の参照とヒープ上の文字列の参照を比較しています...

于 2016-11-21T09:34:39.313 に答える