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💖点点关注,收藏不迷路💖
  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Seal^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值