7
String s1 = "BloodParrot is the man";  
String s2 = "BloodParrot is the man";  
String s3 = new String("BloodParrot is the man");  

System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1.equals(s3));

//
true
true
false
true を出力

3 つすべてが同じ内容を持っている場合、すべての文字列がメモリ内で同じ場所にないのはなぜですか?

4

6 に答える 6

2

の作成Stringは、実際には高速なプロセスです。以前に作成されたものを見つけようとするStringと、はるかに遅くなります。

Stringすべての人をインターンにするために何をする必要があるかを考えてください。以前に構築されたすべての のセットを検索する必要がありますString。これはスレッドセーフな方法で行う必要があるため、オーバーヘッドが増えることに注意してください。これを漏らしたくないので、(スレッドセーフな) 非強参照の何らかの形式を使用する必要があります。

もちろん、このように Java を実装することはできません。残念ながら、ライブラリはStrings やその他のほとんどの不変値オブジェクトのコンストラクターを公開しているためです。

于 2009-02-27T12:55:31.303 に答える
1

String.intern と呼ばれるメソッドがあります。これは、本質的に、同じすべての文字列を取得して、それらをハッシュ テーブルに入れます (私はちょっと嘘をついていますが、これについては現実ではなく概念が重要です)。

String s1 = "BloodParrot is the man";  
String s2 = "BloodParrot is the man";  
String s3 = new String("BloodParrot is the man").intern();  

System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1.equals(s3));

それらがすべて「真」であるべきです。これは、(ここでも少し嘘をついていますが、現実ではなく概念にのみ関係があるためです) String s1 = "BloodParrot は男です"; String s1 = "BloodParrot is the man".intern(); のような処理が行われます。

于 2009-02-27T15:14:21.313 に答える