在项目中经常看到实体类中的set/get方法下都有这样一段代码:
public boolean equals(Object o){} public int hashCode(){}
这个方法的作用是什么呢?
如果没有这些重写equals 和hashcode方法会怎么呢?
这个要从HashMap说起。在定义HashMap时如果key值为自定义对象,必须重写equals和hashCode方法。
直接看代码:
class cimTest_hashcode_equals { private Integer id; public Integer getId() {return id; } public cimTest_hashcode_equals(Integer id) {this.id = id; } // 故意先注释掉equals和hashCode方法 public boolean equals(Object o) { if (o == null || !(o instanceof cimTest_hashcode_equals)) { return false; } else { return this.getId().equals(((cimTest_hashcode_equals) o).getId());} } // public int hashCode() { return id.hashCode(); } }
public class WithoutHashCode { public static void main(String[] args) { cimTest_hashcode_equals k1 = new cimTest_hashcode_equals(1); cimTest_hashcode_equals k2 = new cimTest_hashcode_equals(1); HashMap<cimTest_hashcode_equals,String> hm = new HashMap<cimTest_hashcode_equals,String>(); hm.put(k1, "Key with id is 1"); System.out.println(hm.get(k2)); } }
先说一下执行结果:
1、注释掉equals方法,System.out.println(hm.get(k1)); -> Key with id is 1
2、注释掉equals方法,System.out.println(hm.get(k2)); -> null
1 | case | code | 结果 | 结论 |
2 | 注释掉equals和HashCode方法 | System.out.println(hm.get(k2)) | null | 以 |
3 | ||||
4 | ||||
5 |