我無法理解我寫的下面的代碼中發生了什麼。混亂的Hashmap內部工作
我所做的是,我有一個外部類Employee
一些領域:id,
panNo ,
名and
地址. Then I have an inner class(it was not actually necessary to have it as an inner class) with
ID and
panNo`字段和它們的值是相同的外部類的成員。
根據我所知道的關於HashMaps
,我們使用它們來存儲鍵值對。 該鍵值具有hashcode
值,並且取決於此值hashcode
值被散列。當我們藉助密鑰檢索一個值時,再次對其值hashcode
進行評估,然後獲取適當的值。
所以,hashmap
一定是有什麼樣子的:
重點----->其哈希碼|引用字段-------->引用值對象。
因此,當我嘗試插入具有相同鍵的對象時,插入最後一個的元素纔可用。這是因爲必須有唯一的鍵,這意味着hashcode
值應該只引用一個對象。
現在,我在我的代碼做的是,我在插入地圖中Employee
對象,並使用EmployeeKey
類作爲返回每次都在同hashcode
值即1的關鍵。所以根據我的理解,地圖中應該只有一個元素。但是,這並沒有發生......我錯過了解一些事情。
我已經寫了下面的類:
package package1;
public class Employee {
int id;
int panNo;
String name;
String address;
public Employee(int id, int panNo, String name, String address) {
this.id = id;
this.panNo = panNo;
this.name = name;
this.address = address;
}
@Override
public String toString() {
return "Employee [id=" + id + ", panNo=" + panNo + ", name=" + name + ", address=" + address + "]";
}
public class EmployeeKey {
int id = Employee.this.id;
int panNo = Employee.this.panNo;
@Override
public int hashCode() {
return 1;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
EmployeeKey other = (EmployeeKey) obj;
if (!getOuterType().equals(other.getOuterType()))
return false;
if (id != other.id)
return false;
if (panNo != other.panNo)
return false;
return true;
}
private Employee getOuterType() {
return Employee.this;
}
}
}
,並有一個測試類,如下所示:
public class Test {
public static void main(String[] args) {
Employee e1 = new Employee(1, 123, "neeraj", "pune");
Employee e2 = new Employee(2, 456, "viraaj", "pune");
System.out.println(e1.new EmployeeKey().id);
Map<Employee.EmployeeKey, Employee> myMap = new HashMap<Employee.EmployeeKey, Employee>();
myMap.put(e1.new EmployeeKey(), e1);
myMap.put(e2.new EmployeeKey(), e2);
System.out.println("Size:" + myMap.size());
System.out.println("Hashcode of inner class e1: "
+ e1.new EmployeeKey().hashCode());
System.out.println("Hashcode of inner class e2: "
+ e2.new EmployeeKey().hashCode());
System.out.println(myMap.get(e1.new EmployeeKey()));
System.out.println(myMap.get(e2.new EmployeeKey()));
}
}
這不是HashMap的工作方式:一個人可以擁有多個具有相同散列的鍵,只要equals方法返回false即可。您可以將散列相等檢查看作是對平等的快速測試。如果2個對象具有相同的哈希值 - 它們將被檢查與equals相等。 – Mikey