0

おそらくBlochのEffective Javaのセクションを読んだことを覚えていますが、ほとんどの場合、

String a = "fish";
String b = "fish";

文字列は不変であるため、ほとんどの場合 a == b です。ただし、オブジェクトの一時的な構築などにより、 new String("fish") は個別のオブジェクト参照を生成します。

equals()、不変性、およびオブジェクト作成に関する Bloch の章を調べましたが、覚えているこのビットが見つかりません!! 髪をかきむしっていますが、これがなぜなのか説明がどこにあるか覚えている人はいますか? EJにもないかもしれませんが、見つけたいです。ヒント: これが説明されている場所は、私の実際の質問です。

4

3 に答える 3

10

不変性とは関係ありません。これは、JVM が文字列を処理する方法です。同じ内容の文字列リテラルは、同じオブジェクトを表します (「文字列リテラル」とは、大まかに「引用符で囲まれたテキスト」を意味します)。JVM には文字列オブジェクトのテーブルがあり、各文字列リテラルには、そのテーブル内のオブジェクトが 1 つだけあります。

ただし、新しいインスタンスを明示的に作成する場合は、テーブルから取得した文字列オブジェクトに基づいて新しい文字列オブジェクトを作成します。

リテラルを使用せずに (ただし、toString() を呼び出す、インスタンス化するなどして) 形成された任意の文字列から、 を呼び出して jvm テーブルからオブジェクトを取得できますstr.intern()。このintern()メソッドは、存在する文字シーケンスごとに 1 つのインスタンスを返します。new String("fish").intern()単純に同じインスタンスを返しますString s = "fish"

覚えておくべきことが 2 つあります。

  • 決して使わないnew String("something")
  • 常に文字列を比較しますequals(..)(自分が何をしているのかを本当に理解して文書化していない限り)
于 2011-10-20T21:42:28.447 に答える
0

一定の文字列プールを維持するString.intern()メソッドを探していると思います。

演算子'=='はオブジェクト参照(アドレス)を比較しますが、.equals()は意味的同等性を調べるメソッド呼び出しです。

コンパイラは文字列a="fish"と文字列b="fish"を調べ、同じアドレスを指している場合とそうでない場合があります。ただし、a.intern();を実行する場合。b.intern()の場合、おそらくそれらを同じ文字列プールに入れ、a==bにします。

于 2011-10-20T21:46:17.473 に答える
0

決定的な説明を探している場合は、定義に移動してください: JLS § 3.10.5 String Literals

よく知っておくべきコード例は次のとおりです。

したがって、コンパイル ユニット (§7.3) で構成されるテスト プログラムは次のようになります。

package testPackage;
class Test {
        public static void main(String[] args) {
                String hello = "Hello", lo = "lo";
                System.out.print((hello == "Hello") + " ");
                System.out.print((Other.hello == hello) + " ");
                System.out.print((other.Other.hello == hello) + " ");
                System.out.print((hello == ("Hel"+"lo")) + " ");
                System.out.print((hello == ("Hel"+lo)) + " ");
                System.out.println(hello == ("Hel"+lo).intern());
        }
}
class Other { static String hello = "Hello"; }

およびコンパイルユニット:

package other;
public class Other { static String hello = "Hello"; }

出力を生成します:

true true true true false true
于 2011-10-20T23:54:56.810 に答える