在阅读equals()和hashcode()时,我了解到,如果两个对象相等,那么它们的hashcode必须相等,反之亦然。
但是下面的例子并没有反映这一点。
class Employee{
private String name;
Employee(String name){
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Employee other = (Employee) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
Employee e1 = new Employee("hi");
Employee e2 = new Employee("hi");
如果是,则e1.equals(e2)
返回true,即使它们的哈希代码不同,这从打印e1.hashcode()
和e2.hashcode()
中可以明显看出。
有人能给我解释一下吗?
您需要重写hashcode
方法,并提供与Equals一致的实现。
@Override
public int hashCode() {
return name == null ? 0 : name.hashCode();
}
equals
,则它必须重写hashcode
equals
和hashcode
必须使用同一组字段
equal
,则它们的hashcode
值也必须equal
不可变
,则hashcode
是缓存和惰性初始化
您可以在这里了解如何实现hashcode
基于哈希的[HashMap,HashSet,Hashtable,LinkedHashSet,WeakHashMap]
集合将使用HashCode()
查找/存储桶中的对象,然后它们将调用Equals()
。
问题内容: 我有上述2个类(POJO),它们都是绝对相同的(除了课程名称),我将它们添加到两个数组列表:aListA和aListB。我需要比较两个对象是否相同。如果它们相同,则需要将它们添加到另一个列表(commonList)中,如果它们恰好是不同的,则需要将它们添加到另一个列表(differentList)中。我写了以下代码: 我的问题是,即使两个不同POJO中的数据(变量,firstId和se
我有两个arraylist。employee类和user类的ArrayList。employee类将name、age、address作为字段。用户类将名称、年龄、地址作为字段。下面是两个列表 要检查用户是否和员工的地址相同。如果用户没有地址,则从员工处复制。
问题内容: 我发现Java 的根类方法没有实现: 如果我有一个and an ,如何不使用就知道the 和value ?只需执行即可。 我尝试了两个对象,但令我大吃惊的是值是相同的:它们都是1。 问题答案: 是一种方法,意味着系统库在内部被调用。有关更多详细信息,请参见Java本机接口。
问题内容: 是否有任何的java utils的,允许检查对象平等,不受 平等 覆盖?由于某些原因,我不想为类提供equals方法。我在单元测试中需要类似 SomeUtils.equals(a,b)之 类的东西 , 它比较所有对象字段(我想是通过反射)。 问题答案: 您可以在Apache Commons EqualsBuilder中使用
问题内容: 我了解hashCode的思想以及为什么需要它。但是我对如何为通用对象计算hashCode感到困惑。所以这是我的问题。如果我有一个String,我可能会使用以下函数来计算hashCode, 但是说我有以下目的, 我的IDE为此生成了一个自动的hashCode函数, 我的问题是,由于键和值是通用的,该怎么办?这种方法如何运作? 问题答案: 和是参数化类型的的对象。 这样,将在实际类型上被调
问题内容: 我正在尝试为对象编写一个equals方法,以比较它们的字段 并在相等时返回true。 这可能是什么问题? 问题答案: 由于color 似乎是一个Color,所以是一个类,因此是一个引用类型,这意味着您需要使用它们equals()来比较颜色。 如注释中所述,==用于比较引用类型实际上是比较Java中的内存地址。仅true当它们都 引用内存中的同一对象时,它才会返回。 akf指出,您需要为