Set集合中元素去重的奥秘
💖The Begin💖点点关注,收藏不迷路💖
|
在Java的集合框架中,Set接口是一个非常重要的部分。与List和Map不同,Set集合的一个显著特点是它不允许存储重复的元素。那么,Set是如何判断元素是否重复的呢?接下来,我们就来揭开这个奥秘。
1、equals()方法的作用
Set集合判断元素是否重复的核心在于equals()方法。当我们向Set中添加一个元素时,它会遍历集合中已有的元素,并使用equals()方法与新元素进行比较。如果equals()方法返回true,则说明新元素与集合中的某个元素重复,因此不会被添加到集合中;如果返回false,则说明新元素是唯一的,可以被添加到集合中。
这里需要注意的是,equals()方法并不是判断两个引用是否指向同一个对象,而是判断两个对象的内容是否相等。因此,我们需要在自定义类中覆盖equals()方法,以便正确比较两个对象的内容是否相等。
2、 ==操作符与equals()方法的区别
在Java中,==
操作符用于比较两个引用是否指向同一个对象。如果两个引用指向同一个对象,那么 ==
操作符返回true;否则返回false。这与equals()方法的语义是不同的。
equals()方法是在类中定义的,用于比较两个对象的内容是否相等。默认情况下,equals()方法会比较对象的内存地址(即判断两个引用是否指向同一个对象),但在实际开发中,我们通常会根据业务需求覆盖equals()方法,以便正确比较两个对象的内容是否相等。
3、示例代码
下面是一个Person
类的示例,包含了构造函数、getter和setter方法,以及用于Set
集合去重的equals()
和hashCode()
方法的实现。
import java.util.Objects;
public class Person {
private String name;
private int age;
// 构造函数
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter方法
public String getName() {
return name;
}
// Setter方法
public void setName(String name) {
this.name = name;
}
// Getter方法
public int getAge() {
return age;
}
// Setter方法
public void setAge(int age) {
this.age = age;
}
// 覆盖equals()方法以实现去重
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
// 覆盖hashCode()方法以保持与equals()方法的一致性
@Override
public int hashCode() {
return Objects.hash(name, age);
}
// toString()方法用于打印对象信息(可选)
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
Set<Person> set = new HashSet<>();
Person p1 = new Person("Alice", 25);
Person p2 = new Person("Bob", 20);
Person p3 = new Person("Alice", 25); // 与p1内容相同
set.add(p1);
set.add(p2);
set.add(p3); // 不会被添加,因为与p1内容相同
System.out.println(set.size()); // 输出2,因为p1和p3内容相同,只存储了一个
for (Person person : set) {
System.out.println(person); // 打印集合中的元素信息
}
}
}
在上面的示例中,我们定义了一个Person类,并覆盖了equals()和hashCode()方法。
在main()方法中,我们创建了一个HashSet对象,并向其中添加了三个Person对象。
由于p1和p3的内容相同(姓名和年龄都相同),因此它们被视为重复元素,p3不会被添加到集合中。
最后,我们打印集合的大小,输出结果为2,表示集合中只存储了两个不同的Person对象。
通过覆盖equals()方法,我们可以自定义Set集合中元素的去重规则,从而满足不同的业务需求。
💖The End💖点点关注,收藏不迷路💖
|