在Java中,使用Set去重时,如果涉及到复杂对象,需要重写对象的equals()和hashCode()方法。这是因为Set是基于这两个方法来判断对象是否相等的。以下是一个简单的示例:
- 首先,创建一个复杂对象类,例如Person:
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; } }
- 然后,在主类中使用Set去重:
import java.util.HashSet; import java.util.Set; public class Main { public static void main(String[] args) { SetpersonSet = 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。