面试题答案
一键面试以下是实现此功能的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);
}
}
}
重写方法解释
-
equals方法:
- 用于判断两个对象是否相等。当两个User对象的姓名、年龄和邮箱都相同时,
equals
方法返回true
,表示这两个对象相等。 - 首先判断是否为同一个对象引用(
this == o
),如果是则直接返回true
。 - 然后判断传入对象是否为
null
或者类型是否不匹配,如果是则返回false
。 - 接着将传入对象强制转换为
User
类型,再比较姓名、年龄和邮箱是否相等。
- 用于判断两个对象是否相等。当两个User对象的姓名、年龄和邮箱都相同时,
-
hashCode方法:
Set
集合(如HashSet
)使用哈希表来存储元素,通过对象的哈希码来快速定位元素。- 当向
HashSet
中添加元素时,首先会计算元素的哈希码,然后根据哈希码决定元素在哈希表中的存储位置。 - 为了保证相等的对象(通过
equals
方法判断)具有相同的哈希码,需要重写hashCode
方法。这里采用一种常见的计算哈希码的方式,通过name
、age
和email
的哈希码来生成User
对象的哈希码。这样可以确保相同属性的User
对象具有相同的哈希码,以便HashSet
能够正确判断对象的唯一性。
在上述代码中,userSet
会自动根据User
类重写的equals
和hashCode
方法来校验User
对象的唯一性,在输出userSet
时,只会输出两个不同的User
对象,因为user1
和user3
被视为重复对象。