2017-12-14 13 views
-4

私は以下のプログラムを書いており、出力を理解することはできません。等価とハッシュコードのオーバーライド

package com.demo.strings; 

import java.util.HashMap; 
import java.util.Iterator; 
import java.util.Map; 
import java.util.Set; 

class Emp 
{ 
    private int empNo; 
    private String empName; 
    public Emp(int empno, String empname) 
    { 
     this.empNo=empno; 
     this.empName=empname; 
    } 
    public int getEmpNo() { 
     return empNo; 
    } 
    public void setEmpNo(int empNo) { 
     this.empNo = empNo; 
    } 
    public String getEmpName() { 
     return empName; 
    } 
    public void setEmpName(String empName) { 
     this.empName = empName; 
    } 
    public boolean equals(Object obj) 
    { 
     if(obj != null && obj instanceof Emp) 
     { 
      String name = ((Emp)obj).getEmpName(); 
      if(name.equals(this.getEmpName())) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 
    public int hashcode() 
    { 
     return (this.hashCode()+1); 
    } 
} 

public class StringDemo { 

    public static void main(String[] args) { 
     Emp e1 = new Emp(1,"Stack"); 
     Emp e2 = new Emp(1,"Stack"); 

     Map<Integer,Emp> empMap = new HashMap<Integer,Emp>(); 

     empMap.put(1,e1); 
     empMap.put(2,e2); 


     System.out.println(empMap.size()); 
     System.out.println("Both objects are equal: "+e1.equals(e2)); 
    } 
} 

出力:2 両方のオブジェクトが等しい:真

私はequalshashcodeをオーバーライドしてきたので、Mapはそれで1つのオブジェクトのみを保存することになっています。しかし、それは両方を格納しているようです。 equalshashcodeが上書きされた方法が間違っていますか?誰も私にこの問題を解決する方法を教えてもらえますか?あなたがHashMapを使用しているhere

から

+2

[JavaでequalsメソッドとhashCodeメソッドをオーバーライドする必要があるのはなぜですか?](https://stackoverflow.com/questions/2265503/why-do-i-need-to-override-the-equals- and-hashcode-methods-in-java) –

+1

y 'hashcode()'は 'StackOverflowError'をスローしませんか?それは無限に繰り返されます。 –

答えて

1

最初に読む基礎。 1つのユニークキーのみを格納します。

Map<Integer,Emp> empMap = new HashMap<Integer,Emp>(); 

    empMap.put(1,e1); 
    empMap.put(2,e2); 

上記の3行では、異なるキー(1と2)で2つの要素を保存しようとしています。 「両方のオブジェクトが等しい2:真の」 ようにあなたが出力を得ている

//Try this 
Map<Integer,Emp> empMap = new HashMap<Integer,Emp>(); 

empMap.put(1,e1); 
empMap.put(1,e2); 

この場合、第2プットはe2で最初の値e1を置き換えます。しかしempNameフィールドを比較するために等しいあなたが上書きとして「両方のオブジェクトが等しい1:真」として、それが出力を与える

あなたがe1の宣言を変更し、e2場合

Emp e1 = new Emp(1,"Stack One"); 
Emp e2 = new Emp(1,"Stack Two"); 

として出力

1 
Both objects are equal: false 
になります
+0

それは私の悪いです。私は追加したと思った。 empMap.put(1、e1); empMap.put(1、e2);ありがとうAbhishek – Pardhu