List集合中对象利用retainAll()和removeAll()的获取交集和差集

本文介绍如何通过重写hashcode()和equals()方法实现Java集合中对象的正确比较,并提供了一个Person类示例,展示如何使用这些方法进行集合间的交集和差集运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、首先针对集合中的对象要重写hashcode()和equals()方法;这是因为retainAll()和removeAll()会去利用对象的这两个方法来比较对象是否是同一个对象;

2、举个例子

public class persone{

    private int id;

    private String sex;

    private String name;

    //set get方法

    //重写hashcode方法

    @Override

    public int hashCode(){

        return this.id;

    }

    public Boolean equals(Object obj){

        if(!(obj instanceof Person)){

          Person person =   (Person)obj

            return thid.id = person.id

        }

    }

}

3、说明:上面的例子是根据对象中的id来判断两个对象是否相等,当然也可以根据多个对象;

4、之后可以对比两个对象如:

Person p1 = new Person();

Person p2 = new Person();

p1.retainAll(p2);//交集的结果为p1

p1.removeAll(p2);//差集为p1



### Java 中计算两个 List交集差集 在 Java 中,可以通过 `Set` 接口及其子类来高效地完成列表的交集、并集差集运算。以下是具体的实现方式: #### 计算交集 为了计算两个 `List` 的交集,可以先将其转换为 `HashSet`,然后利用 `retainAll()` 方法保留两者共有的元素。 ```java import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class IntersectionExample { public static Set<String> getIntersection(List<String> list1, List<String> list2) { Set<String> set1 = new HashSet<>(list1); Set<String> intersection = new HashSet<>(set1); // 创建副本以保护原始数据 intersection.retainAll(new HashSet<>(list2)); return intersection; } public static void main(String[] args) { List<String> list1 = new ArrayList<>(); list1.add("A"); list1.add("B"); list1.add("C"); List<String> list2 = new ArrayList<>(); list2.add("B"); list2.add("C"); list2.add("D"); System.out.println(getIntersection(list1, list2)); // 输出 [B, C] } } ``` 此代码片段展示了如何通过 `retainAll()` 来获得两个列表的交集[^3]。 --- #### 计算差集 要计算两个 `List` 的差集(即第一个列表中有而第二个列表中没有的元素),同样可以借助 `removeAll()` 方法。 ```java import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class DifferenceExample { public static Set<String> getDifference(List<String> list1, List<String> list2) { Set<String> difference = new HashSet<>(list1); difference.removeAll(new HashSet<>(list2)); return difference; } public static void main(String[] args) { List<String> list1 = new ArrayList<>(); list1.add("A"); list1.add("B"); list1.add("C"); List<String> list2 = new ArrayList<>(); list2.add("B"); list2.add("C"); list2.add("D"); System.out.println(getDifference(list1, list2)); // 输出 [A] } } ``` 这段代码实现了从第一个列表中移除所有存在于第二个列表中的元素的操作。 --- 需要注意的是,在执行上述操作之前,应确保所使用的对象已经正确重写了 `equals()` `hashCode()` 方法,因为这些方法决定了集合内部元素的唯一性比较逻辑。 --- ### 总结 - **交集** 使用 `retainAll()` 实现。 - **差集** 使用 `removeAll()` 实现。 - 需要注意对象的 `equals()` `hashCode()` 方法是否被适当地覆盖,以便集合能够正常工作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值