2013-02-04 69 views
-2

我在哈希映射中添加了2個對象,但2個值的關鍵字是相同的。甚至實現了hashcode和equals方法。但仍然是表示2個值,而不是3.HashMap的工作流程

代碼:

package test1; 

import java.util.HashMap; 

public class HashMapDemo { 

    int i; 
    String abc; 
    HashMapDemo(int a,String b){ 
     i=a; 
     abc=b; 
    } 
    public String toString(){ 
     return i +abc; 
    } 

    public static void main(String[] args){ 
     HashMapDemo obj1= new HashMapDemo(2,"hello"); 
     HashMapDemo obj2= new HashMapDemo(3,"world"); 
     HashMapDemo obj3= new HashMapDemo(4,"around"); 
     toDos t1=new toDos("aa"); 
     toDos t2=new toDos("bb"); 
     toDos t3=new toDos("aa"); 
     HashMap test=new HashMap(); 
     test.put(t1,obj1); 
     test.put(t2, obj2); 
     test.put(t3,obj3); 
     System.out.println(test.size()+""+test.get(obj2)+test); 

    } 
} 

代碼鍵:

package test1; 

import java.util.HashMap; 

class toDos 
{ 

     String a; 
    toDos(String b){ 
     a=b; 
    } 
    public boolean equals(Object obj){ 
     System.out.println("call of equals"); 
     if((toDos)obj instanceof toDos & (toDos)obj !=null){ 
      toDos temp = (toDos) obj; 
      if(temp.a.equals(this.a)){ 
       return true; 
      } 
     } 
     return false; 

    } 
    public int hashCode(){ 
     System.out.println("call of hasCode"); 
     return (a!=null)? a.hashCode():0; 
    } 

    public String toString(){ 
     return a; 
    } 
} 
+1

你不能*擁有*「2個值的鍵是相同的」。密鑰在HashMap中是* unique *。 –

+1

做'System.out.println(test.put(t3,obj3))'。放置HashMap將返回與該鍵關聯的先前值 –

回答

0

看來t1.equals(t3) - 因而,的t3插入覆蓋首先插入條目。

HashMap中,每個不同的鍵都有一個關聯值 - 並且由於t1t3彼此相等 - 您只有2個不同的鍵。

作爲一個附註 - 您應該儘量避免使用raw types並儘量使用generics types

1

根據你的等於class toDos的方法,如果String a是相同的,那麼兩個對象都是相同的。

HashMap test=new HashMap(); 
test.put(t1,obj1); // "aa" 
test.put(t2,obj2); // "bb" 
test.put(t3,obj3); //"aa" 

因此,Obj1和obj2都將被視爲相同的對象,因此您的舊值obj1將替換爲obj3。