2012-02-23 22 views
5

同じStringが実際には同じでない場合は、同じStringオブジェクトを使用せずにHashMapの文字列をキーとして使用するのはなぜですか?なぜHashMapのキーとして文字列を使用できますか?

String s1 = "Test"; 
String s2 = "Test"; 

System.out.println(s1 == s2); // should be false 
System.out.println(s1.equals(s2)); // should be true 

HashMap<String, String> map = new HashMap(); 
map.put(s1, "foo"); 
System.out.println(map.get(s2)); // should be "foo"--but why? 

HashMapStringオブジェクトのためのいくつかの特別な振る舞いを持っていますか?もしそうでなければ、2つの "異なる"文字列を使ってハッシュ値を入れたり、値を取得したりすることができますか?

+6

文字列インターンのため、 's1 == s2'は' true'になります。 –

+0

それで 'String'を比較するために' .equals() 'を使うのはなぜ標準的な習慣ですか? –

+1

@Ted Hopp s1 == s2は*定数プールのためにtrueになります。 – EJP

答えて

14

HashMapは、equals()hashCode()を呼び出してオブジェクトを比較します。
Stringは、値で比較するこれらのメソッドをオーバーライドします。

4

に同一である、2つの文字列が

実際には同じではない。しかし、彼らはしている場合。 equals()メソッドの下では等しく、それはMapインターフェイスの等価性テストで指定されたテクニックです。

System.out.println(s1 == s2); // should be false 

しかし、それは間違いではありません。コンパイラによる定数のプールのため、両方とも同じ文字列を参照します。

2

HashMapは内部でキーを比較すると、ではなくequals()メソッドを使用します。だから、オブジェクトの平等は、キーマッチの罰金ですequals()が上書きされている場合、参照の等価は必要ありません(java.lang.Stringの場合のように。)一般的に

5

は、あなたがテストする==をHashMapのはequals()を使用しているため、Stringオブジェクトを使用してすることはできませんキーの平等。

1

System.out.println(s1 == s2); //は偽である必要があります

そうしてはいけません。 Javaコンパイラは、2つの文字列を同じ場所に最適化して指すことがあります。

更新

public class Test { 

    public static void main(String... args) { 
     String s1 = "abc"; 
     String s2 = "abc"; 

     System.out.println(s1 == s2); 
    } 

} 

出力

javac Test.java 
java Test 
> true 
+0

間違った、間違った、間違っています。シンプルなコードで簡単に証明できます。 – duffymo

+3

それは間違っていません。それは「インターン」と呼ばれています。 –

+2

「最適化する」とは、Javaコンパイラが仕様に準拠していることを前提に、「最適化しなければならない」ということを意味すると思います。 http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.5 – yshavit

-2

私たちは本当に基本的な最初に戻って行く必要があります。

基本的なコンピュータサイエンス:

==メモリアドレス(基準)を比較

.equalsメモリアドレス

のJava基本に格納された値とを比較します。 jvm全体に渡る文字列オブジェクトのコピーは1つしかありません

+3

あなたの答えのほとんどすべての行は、微妙にまたはまったく間違っています – SLaks

+0

これらは「コンピュータ科学の基礎」ではありません。それらは* Java *の基本です。 Javaリファレンスは必ずしもメモリアドレスである必要はありません。 'new String(...)'構造を使用すると、文字列のコピーが複数存在する可能性があります。 – EJP