在Java中,使用Set去重时,如果涉及到复杂对象,需要重写对象的equals()和hashCode()方法。这是因为Set是基于这两个方法来判断对象是否相等的。以下是一个简单的示例:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 重写equals()方法
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Person person = (Person) obj;
return age == person.age && Objects.equals(name, person.name);
}
// 重写hashCode()方法
@Override
public int hashCode() {
return Objects.hash(name, age);
}
// 添加getter和setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<Person> personSet = new HashSet<>();
Person person1 = new Person("Alice", 30);
Person person2 = new Person("Bob", 25);
Person person3 = new Person("Alice", 30); // 与person1具有相同的属性和值
personSet.add(person1);
personSet.add(person2);
personSet.add(person3);
System.out.println("PersonSet size: " + personSet.size()); // 输出:PersonSet size: 2
}
}
在这个示例中,我们创建了一个Person类,并重写了equals()和hashCode()方法。这样,当我们使用Set去重时,Set会根据这些方法来判断对象是否相等。在这个例子中,person3与person1具有相同的属性和值,但它们被视为不同的对象,因为它们的内存地址不同。因此,Set的大小为2。