2017-06-21 81 views
0

我想了解HashMap放置行爲,並且我對以下方案有點困惑。下面是實現爲此我將在HashMap中瞭解HashMap放置方法

class Person { 
    int id; 
    String name; 

    public int getId() { 
     return id; 
    } 

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

    public String getName() { 
     return name; 
    } 

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

    @Override 
    public String toString() { 
     return "Person [id=" + id + ", name=" + name + "]"; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + id; 
     result = prime * result + ((name == null) ? 0 : name.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Person other = (Person) obj; 
     if (id != other.id) 
      return false; 
     if (name == null) { 
      if (other.name != null) 
       return false; 
     } else if (!name.equals(other.name)) 
      return false; 
     return true; 
    } 

} 

關鍵用於測試目的,我有一個實用程序方法

public void displayMap() { 
     Person person = new Person(); 
     person.setId(1); 
     person.setName("praveen"); 
     Map<Person, String> mapPerson = new HashMap<>(); 
     mapPerson.put(person, ""); 
     person.setId(2); 
     person.setName("praveen"); 
     mapPerson.put(person, ""); 
     System.out.println(mapPerson); 
    } 

我預計輸出爲{Person [id=1, name=praveen]=, Person [id=2, name=praveen]=}類之一,但我看到它如{Person [id=2, name=praveen]=, Person [id=2, name=praveen]=}

我使用同一個人對象插入多次作爲關鍵但具有不同的id值。但據我的理解,如果密鑰相同,理想情況下應該用新密鑰替換現有密鑰。但是我看到的是id = 2和name = praveen多次顯示的人。是不是重複鍵和違反hashmap原理與重複鍵?爲什麼它顯示{Person [id=2, name=praveen]=, Person [id=2, name=praveen]=}沒有{Person [id=1, name=praveen]=, Person [id=2, name=praveen]=}

+0

出於好奇,你有沒有試圖比較mapPerson中的兩個值?他們是否等同? – Johnnie

+0

我做了,它返回等於 – Praveen

回答

2

從地圖的Javadoc:

注意:如果使用可變對象作爲map的key很大,一定要小心。如果對象的值以影響等於比較的方式更改,而對象是地圖中的關鍵字,則不會指定地圖的行爲。

該指令的總結:永遠,永遠修改東西,你只是把作爲地圖的關鍵,不好的事情會發生,而且也沒有告訴什麼不好的事情會發生的方式。

你修改了一些你放入地圖鍵的東西,基本上壞事發生了。

您應該啓動一個新的Person第二次插入的對象,然後事情將正常發生。

+0

你的意思是說行爲在這種情況下不被預測?我很好奇爲什麼第二個放置語句會改變id = 1的密鑰 – Praveen

+0

您存儲對鍵的引用,而不是副本。在你的整個程序中,只有一個Person對象。 –

+0

現在明白了。感謝 – Praveen