何时覆盖hashcode和equals方法在java中
问题描述:
需要对散列码和hashcode中的equals方法提出一些问题和解释。下面是问题:何时覆盖hashcode和equals方法在java中
- 什么时候在put或get期间调用hashcode和equals会被调用?
- 当我们存储自定义对象时,我在每个教程中发现我们需要重写hashcode。但如果我不重写,那么它会产生相同的结果。除了当我使用新的运营商。下面是示例程序:
我将员工对象存储到散列映射中,然后我没有重写散列码和等于方法,那么代码按预期工作。
Employee e1= new Employee("ram", 1000);
Employee e2= new Employee("sai", 1001);
Employee e3= new Employee("krishna", 1002);
System.out.println("e1.hashCode() : "+e1.hashCode());
System.out.println("e2.hashCode() : "+e2.hashCode());
System.out.println("e3.hashCode() : "+e3.hashCode());
Map<Employee, String> map= new HashMap<Employee, String>();
map.put(e1, "employee1");
map.put(e2, "employee2");
map.put(e3, "employee3");
for (Entry<Employee, String> entry : map.entrySet())
{
System.out.println(entry.getKey().getName() +"-"+entry.getKey().getid() + "-" + entry.getValue());
}
System.out.println(map.get(e3));
System.out.println(map.get(new Employee("krishna", 1002)));
- 当你重写equals,需要被照顾什么东西。
- 当您重写散列码时,需要注意哪些事项。
- 当您只覆盖等于,那么默认哈希码将如何表现。
- 当你只重写哈希码,那么该如何默认平等的行为。*
答
阅读本Article了详细的解释。
总之,即使你没有在你的类中实现hashCode和equals,也有一个从Object类继承的默认实现。这就是为什么你没有看到任何问题。
但是使用Collections时肯定会遇到问题。
答
Hashcode和equals需要最小化冲突。您的目标是以这种方式实现散列码,以便存储桶中只有一个条目。 Equals将帮助您区分哈希码相同的两个条目。散列码和等于一起决定两个密钥是否相同。所以如果这些都没有照顾,两个不同的自定义对象可能被视为相同的关键,第二个将替换地图中的第一个。
伙计,这就像你甚至没有尝试。这些问题在谷歌第一页的任何结果中回答为“java equals hashCode”。 –
尝试再次添加相同的员工,但作为新的实例:'员工e4 =新员工(“克里希纳”,1002);'然后它会停止工作,因为你期望。 – RadekJ
除了作为(其他许多人)的副本之外,你的问题太广泛了,而且在问你问题之前,你显然还没有充分研究过这个问题(例如用Google搜索答案)。 –