2014-11-26 2 views
1

다음 코드 샘플의 출력에 대한 이해와 확인하지 것은 :자바 HashMap의 반환 값은 등호 및 해시 코드

{1 - E = E2, 2 - E1 = E1}

package com.sid.practice; 

import java.util.HashMap; 
import java.util.Map; 

public class InputOutputPractice 
{ 

    public InputOutputPractice() 
    { 

    } 

    public static void main(String[] args) 
    { 
     Employee e = new InputOutputPractice().new Employee(1, "e"); 
     Employee e1 = new InputOutputPractice().new Employee(2, "e1"); 
     Employee e2 = new InputOutputPractice().new Employee(1, "e2"); 

     Map m = new HashMap(); 
     m.put(e, "e"); 
     m.put(e1, "e1"); 
     m.put(e2, "e2"); 
     System.out.println(m); 

    } 

    class Employee 
    { 
     public Employee(int id, String name) 
     { 
      this.id=id; 
      this.name = name; 
     } 

     private int id; 
     private String name; 

     public String getName() 
     { 
      return name; 
     } 

     public void setName(String name) 
     { 
      this.name = name; 
     } 

     public int getId() 
     { 
      return id; 
     } 

     public void setId(int id) 
     { 
      this.id = id; 
     } 

     @Override 
     public boolean equals(Object obj) 
     { 
      return ((Employee)obj).getId()==(this.getId()); 
     } 

     @Override 
     public int hashCode() 
     { 
      return Integer.valueOf(getId()).hashCode(); 
     } 

     @Override 
     public String toString() 
     { 
      return this.id + "--" + this.name; 
     } 
    } 
} 

오브젝트 e2이 오브젝트 e의 키를 겹쳐 쓸 수 있었지만 값은 이해하지 못했습니다. 나의 이해에서 출력이 있었어야 :

{1 - E2 = E2, 2 - E1 = E1}

답변

2

사실, 거꾸로 얻었다. 값이 무시되었습니다. HashMap에 관한 한 e와 e2는 동일하므로 키가 대체되지 않았습니다.

귀하의 출력 {1--e=e2, 2--e1=e1}입니다 :

key = e, value = "e2" (which overrode the old value "e") 
key = e1, value = "e1" 
+0

전체 개체를 덮어 쓸 수 있다고 생각했습니다. – Sid

2

put 방법 HashMap의 상태에 대한 Javadocs :

과 지정된 키를이 맵에 관련 지정된 값. 지도에 이전에 키에 대한 매핑이 포함 된 경우 이전 값이 대체됩니다.

따라서 키는 덮어 쓰지 않고 값만 씁니다.

+0

전체 개체를 덮어 쓸 것으로 생각했습니다. – Sid

+0

그러나지도의 경우 두 개의 객체가 있습니다 : 하나의 키와 하나의 값. 키의 hashCode는 키를 고유하게 식별한다고 가정하므로 키를 덮어 쓸 필요가 없습니다. 따라서 값만 덮어 씁니다. – Petter

+0

알았어, 고마워! – Sid

0

java.util.HashMap 구현은 put() 호출에서 제공된 키와 같을 때 기존 키를 대체하지 않습니다. 따라서 세 번째 put()은지도의 기존 내용을 확인하고 기존 동일 키를 찾고 연관된 값을 업데이트합니다.

equals()와 hashCode()가 equals로 간주되는 객체가 많은 util 클래스에 의해 상호 교환 가능한 것으로 간주되는 이유는 일반적으로 모든 속성을 고려해야하는 이유입니다.

0

출력 뒤에 그 이유 {1 - E = E2, 2 - E1 = E1}입니다 : 기초에 존재하는 일치 (있는 경우

지도에만 값을 그렇게 키 입력 대체합니다하지 않습니다 키의)를 기존지도에 추가합니다. 이 경우에도 적용됩니다.

여기에서 e는 Map에 대해 e2와 같습니다. Map이 m.put (e2, "e2")를 넣을 위치를 검색 할 때; e- "e1"이있는 위치로 이동하여 "e1"을 "e2"로 대체하고이 경우 키를 그대로 둡니다.