MST

星途 面试题库

面试题:Java Set集合在复杂对象唯一性校验中的应用

假设有一个自定义的Java类User,包含姓名(name)、年龄(age)和邮箱(email)属性。要求使用Set集合来校验User对象的唯一性,即当两个User对象的姓名、年龄和邮箱都相同时视为重复。请写出实现此功能的代码,并详细解释在自定义类中如何重写相关方法以配合Set集合的唯一性判断机制。
50.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

以下是实现此功能的Java代码:

import java.util.HashSet;
import java.util.Set;

class User {
    private String name;
    private int age;
    private String email;

    public User(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }

    // 重写equals方法,用于判断两个User对象是否相等
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return age == user.age &&
                name.equals(user.name) &&
                email.equals(user.email);
    }

    // 重写hashCode方法,用于生成对象的哈希码
    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + name.hashCode();
        result = 31 * result + age;
        result = 31 * result + email.hashCode();
        return result;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                '}';
    }
}

public class Main {
    public static void main(String[] args) {
        Set<User> userSet = new HashSet<>();
        User user1 = new User("Alice", 25, "alice@example.com");
        User user2 = new User("Bob", 30, "bob@example.com");
        User user3 = new User("Alice", 25, "alice@example.com");

        userSet.add(user1);
        userSet.add(user2);
        userSet.add(user3);

        for (User user : userSet) {
            System.out.println(user);
        }
    }
}

重写方法解释

  1. equals方法

    • 用于判断两个对象是否相等。当两个User对象的姓名、年龄和邮箱都相同时,equals方法返回true,表示这两个对象相等。
    • 首先判断是否为同一个对象引用(this == o),如果是则直接返回true
    • 然后判断传入对象是否为null或者类型是否不匹配,如果是则返回false
    • 接着将传入对象强制转换为User类型,再比较姓名、年龄和邮箱是否相等。
  2. hashCode方法

    • Set集合(如HashSet)使用哈希表来存储元素,通过对象的哈希码来快速定位元素。
    • 当向HashSet中添加元素时,首先会计算元素的哈希码,然后根据哈希码决定元素在哈希表中的存储位置。
    • 为了保证相等的对象(通过equals方法判断)具有相同的哈希码,需要重写hashCode方法。这里采用一种常见的计算哈希码的方式,通过nameageemail的哈希码来生成User对象的哈希码。这样可以确保相同属性的User对象具有相同的哈希码,以便HashSet能够正确判断对象的唯一性。

在上述代码中,userSet会自动根据User类重写的equalshashCode方法来校验User对象的唯一性,在输出userSet时,只会输出两个不同的User对象,因为user1user3被视为重复对象。