📌  相关文章
📜  如何避免在Java中的 TreeSet 中出现重复的用户定义对象?(1)

📅  最后修改于: 2023-12-03 15:24:57.163000             🧑  作者: Mango

如何避免在Java中的 TreeSet 中出现重复的用户定义对象?

当使用 Java 中的 TreeSet 时,我们需要确保插入的元素不会重复。对于基本数据类型,Java 提供了比较函数,因此我们可以轻松地避免这种情况。但是,对于用户定义的对象,我们需要重写 equals() 和 hashCode() 方法才能使用 TreeSet 进行元素无序且不重复的存储。

重写 equals() 方法

在 Java 中,Object 类的 equals() 方法用于比较对象的引用地址是否相等。由于我们可能需要比较对象的属性而非引用地址,因此我们需要重写 equals() 方法。以下是一些实现 equals() 方法的步骤:

  1. 检查参数是否为空或是否是该类的实例。
  2. 检查参数与当前对象的引用地址是否相等。
  3. 将参数强制转换为该类的对象。
  4. 检查需要比较的属性是否相等。

例如,以下是一个简单的用户定义对象(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。

重写 hashCode() 方法

Java 中的 hashCode() 方法返回对象的哈希码,用于在哈希表等数据结构中进行快速查找。当在 TreeSet 中使用用户定义的对象时,我们需要确保 hashCode() 方法生成与 equals() 方法相对应的哈希码。

以下是实现 hashCode() 方法的步骤:

  1. 定义一个初始值非零且质数的 int 变量 result,例如 17。
  2. 将需要比较的属性连接到 result 变量中。
  3. 返回 result 变量值。

例如,与上面的例子相同,以下是一个简单的用户定义对象(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() 方法相对应。