2011-06-28 9 views
6

誰かが下記の例でhashCodeが呼ばれた理由を説明できますか?この例では、なぜhashcodeが呼び出されますか?

import java.util.List; 

public class JSSTest extends Object{ 

    public static void main(String args[]){ 

     JSSTest a = new JSSTest(); 
     JSSTest b = new JSSTest(); 
     List<JSSTest> list = new java.util.ArrayList<JSSTest>(); 
     list.add(a); 
     list.add(b); 
     System.out.println(list.get(0)); 
     System.out.println(list.get(1)); 
    } 

    @Override 
    public boolean equals(Object obj){ 
     System.out.println("equals"); 
     return false; 
    } 

    @Override 
    public int hashCode(){ 
     System.out.println("hashCode"); 
     return super.hashCode(); 
    } 
} 

結果:

hashCode 0 
[email protected] 
hashCode 0 
[email protected] 
+1

デバッガでスタックトレースを取ったりブレークポイントを追加しようとしましたか? –

+2

数字「1bab50a」または「c3c749」を見て、それがオブジェクトのハッシュコードとどのように比較されているかを見ることは大きな手掛かりになります。 –

答えて

15

デフォルトのtoString()の実装ではhashCodeがコールされます。これはリストとは関係ありません。

public class JSSTest { 

    public static void main(String args[]){ 
     JSSTest test = new JSSTest(); 
     // Just to show it's not part of creation... 
     System.out.println("After object creation"); 
     test.toString(); 
    } 

    @Override 
    public boolean equals(Object obj){ 
     System.out.println("equals"); 
     return false; 
    } 

    @Override 
    public int hashCode(){ 
     System.out.println("hashCode"); 
     return super.hashCode(); 
    } 
} 

(あなたも、細部の後に/ /スーパーコールする前に表示するtoString()をオーバーライドすることができます。)

それはObject.toString()に記載されます::

はここでかなり最小限REPROですObjectクラスのtoStringメソッドは、オブジェクトがインスタンスであるクラスの名前、アットマーク文字 `@ '、および符号なしのheオブジェクトのハッシュコードのxadecimal表現。換言すれば、この方法は、の値に等しい文字列を返す:

getClass().getName() + '@' + Integer.toHexString(hashCode()) 
7
System.out.println(list.get(0)); 

私はそれがすべてのオブジェクトは、あなたがあなた自身のクラスにtoString()を上書きしない限り持ってObject.ToStringを()メソッドの一部だと考えています。それを試してみてください。

+0

Thx。それだけでも正しいですが、正しい答えを1つマークすることができます。ティックアップ: – JSS

6

ObjecttoString()実装が上書きtoString

public String toString() { 
    return getClass().getName() + "@" + Integer.toHexString(hashCode()); 
    } 

..それを呼び出し、それがないので

+0

Thx。それだけでも正しいですが、正しい答えを1つマークすることができます。与えられた瞬間 – JSS

関連する問題