📅  最后修改于: 2023-12-03 15:24:57.163000             🧑  作者: Mango
当使用 Java 中的 TreeSet 时,我们需要确保插入的元素不会重复。对于基本数据类型,Java 提供了比较函数,因此我们可以轻松地避免这种情况。但是,对于用户定义的对象,我们需要重写 equals() 和 hashCode() 方法才能使用 TreeSet 进行元素无序且不重复的存储。
在 Java 中,Object 类的 equals() 方法用于比较对象的引用地址是否相等。由于我们可能需要比较对象的属性而非引用地址,因此我们需要重写 equals() 方法。以下是一些实现 equals() 方法的步骤:
例如,以下是一个简单的用户定义对象(Person)及其重写的 equals() 方法的示例:
public class Person {
private int id;
private String name;
// constructor, getters and setters
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof Person)) return false;
Person p = (Person) o;
return p.id == this.id && p.name.equals(this.name);
}
}
在此示例中,我们首先检查参数是否为该类的实例, 然后检查参数与当前对象的引用地址是否相等。接下来,我们将参数强制转换为该类的对象,最后检查需要比较的属性是否相等,如果相等则返回 true。
Java 中的 hashCode() 方法返回对象的哈希码,用于在哈希表等数据结构中进行快速查找。当在 TreeSet 中使用用户定义的对象时,我们需要确保 hashCode() 方法生成与 equals() 方法相对应的哈希码。
以下是实现 hashCode() 方法的步骤:
例如,与上面的例子相同,以下是一个简单的用户定义对象(Person)及其重写的 hashCode() 方法的示例:
@Override
public int hashCode() {
int result = 17;
result = 31 * result + this.id;
result = 31 * result + this.name.hashCode();
return result;
}
在此示例中,我们定义了初始值为 17 的 result 变量。然后,我们将 id 属性和 name 属性连接到 result 变量中。最后,我们返回 result 变量的值。
以下是一个演示如何使用 TreeSet 存储用户定义对象的示例代码:
TreeSet<Person> set = new TreeSet<>();
set.add(new Person(1, "Alice"));
set.add(new Person(2, "Bob"));
set.add(new Person(1, "Alice"));
for (Person person : set) {
System.out.println(person.getName());
}
在此示例中,我们创建了三个 Person 对象并将它们添加到 TreeSet 中。由于我们已经重写了 equals() 和 hashCode() 方法,因此插入第三个对象时不会出现重复元素。最终输出将是:
Alice
Bob
当在 Java 中使用 TreeSet 存储用户定义对象时,我们需要重写 equals() 和 hashCode() 方法以确保元素不重复。在 equals() 方法中,我们应该比较对象的属性而非其引用地址。在 hashCode() 方法中,我们应该保证生成的哈希码与 equals() 方法相对应。