如果我有一个employee类作为hashMap的键,并且我使用id字段重写employee equals函数,使用name字段重写hashcode函数。会发生什么呢?
发布于 2015-07-05 16:15:30
以下是一些场景,如果您使用empId覆盖散列代码,则可能会发生这种情况。
注意:下面的hashcode和equals方法的实现是根据问题的需求完成的。
Employee.java
public class Employee {
private String empId;
private String empName;
public Employee(String empId, String empName) {
super();
this.empId = empId;
this.empName = empName;
}
@Override
public int hashCode() {
return empName.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
Employee employee = (Employee) obj;
return this.empId.equals(employee.empId);
}
@Override
public String toString() {
return "Employee [empId=" + empId + ", empName=" + empName + "]";
}
}TestHashCode.java
public class TestHashCode {
public static void main(String[] args) {
HashMap<Employee, String> map = new HashMap<Employee, String>();
/**
* Below two object are unequal by equals method and have same hash
* code. Both employee1 & employee2 will be stored in same bucket
* Corresponding to hash code in a linked list.
*/
Employee employee1 = new Employee("123", "abc");
Employee employee2 = new Employee("124", "abc");
map.put(employee1, "abc");
map.put(employee2, "xyz");
// output:Collosionresult:abc,xyz
System.out.println("Collosionresult:" + map.get(employee1) + ","
+ map.get(employee2));
/**
* Below two object are equal by equals method and have same hash code.
* Value will be overridden. Meaning both employee3 & employee4 will get
* the same value ie. the most recently updated value(world).
*/
Employee employee3 = new Employee("hello", "pqr");
Employee employee4 = new Employee("hello", "pqr");
map.put(employee3, "hello");
map.put(employee4, "world");
//Output:OverriddenResult:world,world
System.out.println("OverriddenResult:" + map.get(employee3) + ","
+ map.get(employee4));
}hashCode的总合同是:
始终返回相同的整数,前提是对象上的等于比较中使用的信息未被修改。此整数不需要
从应用程序的一次执行到另一次执行保持一致
执行相同的application.
这两个对象中的每一个都必须产生不同的整数结果。
但是,程序员应该意识到,生成截然不同的
不相等对象的整数结果可能会提高
哈希表。
https://stackoverflow.com/questions/31226953
复制相似问题