equals
方法equals
方法用于比较两个对象的内容是否相等。默认情况下,Object
类中的 equals
方法比较的是对象的引用(即内存地址),只有当两个对象的引用相同时,才会返回 true
。
示例:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age && name.equals(person.name);
}
}
在这个 Person
类中,equals
方法被重写,以便比较 name
和 age
是否相等,而不是使用默认的引用比较。
hashCode
方法hashCode
方法返回对象的哈希值,一个 int
类型的整数。这个哈希值通常用于确定对象在哈希表中的索引位置。hashCode
的默认实现也是基于对象的内存地址。
hashCode
和 equals
的关系hashCode
和 equals
方法的实现之间存在以下关系和约定:
相等对象必须具有相同的哈希值:如果两个对象通过 equals
方法比较返回 true
,那么这两个对象的 hashCode
值必须相同。这是为了保证在哈希表中可以正确定位和存储相等的对象。
示例:
Person p1 = new Person("Alice", 25);
Person p2 = new Person("Alice", 25);
if (p1.equals(p2)) {
System.out.println(p1.hashCode() == p2.hashCode()); // 结果应为 true
}
不相等的对象可能具有相同的哈希值:如果两个对象通过 equals
方法比较返回 false
,它们的 hashCode
值可以相同(虽然哈希值相同,但不等的对象在集合中还是可以区分开的)。这意味着不同对象可能会被散列到同一个哈希桶中,这种情况称为“哈希冲突”。
hashCode
和 equals
在集合中的应用在集合类(如 HashSet
、HashMap
)中,hashCode
和 equals
的配合使用至关重要。
存储对象:当你向 HashSet
添加一个对象时,首先调用对象的 hashCode
方法来确定它的哈希值和存储桶。如果该桶中已经有对象,则调用 equals
方法检查是否存在相等的对象。如果存在,则新对象不会被添加,因为 Set
不允许重复元素。
示例:
Set<Person> set = new HashSet<>();
set.add(p1);
set.add(p2); // 因为 p1.equals(p2) 返回 true,所以 p2 不会被添加
查找对象:当你在 HashMap
中查找一个键对应的值时,首先根据键的 hashCode
计算出哈希值,然后在对应的桶中使用 equals
方法找到匹配的键。
hashCode
和 equals
的最佳实践equals
时,也要重写 hashCode
,并且遵守上面提到的约定。HashSet
中,尽量让该对象的属性不可变(final
),因为一旦对象的属性被改变,它的 hashCode
值也会改变,这可能导致对象无法被正确地查找到。equals
方法比较对象的内容是否相等,而 hashCode
返回对象的哈希值。equals
返回 true
),它们的 hashCode
值必须相同。hashCode
值可以相同,但会导致哈希冲突。HashSet
、HashMap
),hashCode
和 equals
方法决定了对象的存储和查找行为,因此必须一致地重写这两个方法。