Set<自定义类>内部是如何判重的?
时间: 2023-12-13 10:03:22 浏览: 32
在 `Set<自定义类>` 内部判重通常依赖于两个方法:`hashCode()` 和 `equals()`。
`hashCode()` 方法返回对象的哈希码,它用于确定对象在哈希表中的存储位置。在 `Set` 中,当需要判断两个对象是否相等时,首先会比较它们的哈希码。如果两个对象的哈希码不同,那么它们被认为是不同的对象,不会进行进一步的比较。因此,重写 `hashCode()` 方法是非常重要的。
`equals()` 方法用于比较两个对象是否相等。在 `Set` 中,当两个对象的哈希码相同(即可能是同一个存储位置),会进一步调用 `equals()` 方法来比较它们的实际内容。如果 `equals()` 方法返回 `true`,则判定这两个对象是相等的,重复元素将不会被添加到 `Set` 中。因此,也需要正确地重写 `equals()` 方法。
要确保 `Set<自定义类>` 内部能够正确判重,需要满足以下条件:
1. 重写 `hashCode()` 方法:确保相等的对象具有相同的哈希码。
2. 重写 `equals()` 方法:确保相等的对象返回 `true`。
同时,还应该遵循以下约定:
1. 如果两个对象相等(即 `equals()` 返回 `true`),则它们的哈希码必须相等。
2. 如果两个对象的哈希码相等,它们并不一定相等(即 `equals()` 返回 `false`),这种情况被称为哈希冲突。
具体的实现方式会根据自定义类的属性和业务逻辑而有所不同,一般来说,需要根据对象的某些属性来计算哈希码,并在 `equals()` 方法中比较这些属性的值是否相等。
下面是一个示例,假设自定义类为 `Person`,它有一个属性 `id`:
```java
public class Person {
private int id;
// 其他属性和方法...
@Override
public int hashCode() {
return Objects.hash(id);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Person other = (Person) obj;
return id == other.id;
}
}
```
在上述示例中,我们通过重写 `hashCode()` 方法使用 `Objects.hash()` 方法计算哈希码,使用 `id` 属性进行比较。在 `equals()` 方法中,首先判断两个对象是否为同一个引用,然后判断类别是否相同,最后比较 `id` 属性的值。
通过正确实现 `hashCode()` 和 `equals()` 方法,就可以确保 `Set<自定义类>` 内部能够正确判重。