Java集合之交并差集

本文介绍了Java中处理非对象和对象集合的交并差集操作。对于非对象集合,通过List自带方法和使用CollectionUtils包进行操作,注意在使用CollectionUtils时需要导入相应库。而在处理对象集合时,由于比较的是对象属性值,因此需要重写equals()和hashCode()方法以确保正确比较。

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

一.非对象集合

1.List自带方法

方法功能
retainAll()交集
removeAll()差集
addAll()并集

求并集时记得去重

public class Main {
    public static void main(String[] args) {
        // [1,2,3]
        List<Integer> list01 = new ArrayList<>();
        Integer[] arr = new Integer[]{1,2,3};
        list01.addAll(Arrays.asList(arr));

        // [4,5,6]
        List<Integer> list02 = new ArrayList<>();
        arr = new Integer[]{4,5,6};
        list02.addAll(Arrays.asList(arr));

        // [1,3,6]
        List<Integer> list03 = new ArrayList<>();
        arr = new Integer[]{1,3,6};
        list03.addAll(Arrays.asList(arr));

        // 交集
        List<Integer> listA = new ArrayList<>(list01);
        listA.retainAll(list03);
        System.out.println(listA);
        // [1,3]

        // 并集
        List<Integer> listB = new ArrayList<>(list01);
        listB.removeAll(list02); // 去重
        listB.addAll(list02);
        System.out.println(listB);
        // [1, 2, 3, 4, 5, 6]

        // 差集
        List<Integer> listC = new ArrayList<>(list01);
        listC.removeAll(list03);
        System.out.println(listC);
        // [2]
    }
}

2.使用CollectionUtils

需要自己下载org.apache.commons.collections4 包。

方法功能
intersection()交集
union()并集
subtract()差集
import org.apache.commons.collections4.CollectionUtils;
public class Main {
    public static void main(String[] args) {
        // [1,2,3]
        List<Integer> list01 = new ArrayList<>();
        Integer[] arr = new Integer[]{1,2,3};
        list01.addAll(Arrays.asList(arr));

        // [4,5,6]
        List<Integer> list02 = new ArrayList<>();
        arr = new Integer[]{4,5,6};
        list02.addAll(Arrays.asList(arr));

        // [1,3,6]
        List<Integer> list03 = new ArrayList<>();
        arr = new Integer[]{1,3,6};
        list03.addAll(Arrays.asList(arr));

        // 交集
        System.out.println(CollectionUtils.intersection(list01,list03));
        // [1, 3]

        // 并集
        System.out.println(CollectionUtils.union(list01,list02));
        // [1, 2, 3, 4, 5, 6]

        // 差集
        System.out.println(CollectionUtils.subtract(list01,list03));
        // [2]
}

二.对象集合

对象集合操作时要重写equals()和hashCode()方法。
因为比较的是对象属性的值,而不是对象内存地址

public class Student {
    Integer sid;
    String sname;

    public Student() {
    }

    public Student(Integer sid, String sname) {
        this.sid = sid;
        this.sname = sname;
    }

    public Integer getSid() {
        return sid;
    }

    public void setSid(Integer sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (o == null || getClass() != o.getClass())
            return false;
        Student student = (Student) o;
        return Objects.equals(sid, student.sid) && Objects.equals(sname, student.sname);
    }

    @Override
    public int hashCode() {
        return Objects.hash(sid, sname);
    }

    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", sname='" + sname + '\'' +
                '}';
    }
}
public class Main {
    public static void main(String[] args) {
        Student s1 = new Student(1,"张三");
        Student s2 = new Student(2,"李四");
        // s3 和 s3s 应看作同一个人
        Student s3 = new Student(3,"王五");
        Student s3s = new Student(3,"王五");
        List<Student> list01 = new ArrayList<>();
        list01.add(s1);
        list01.add(s3);
        List<Student> list02 = new ArrayList<>();
        list02.add(s2);
        list02.add(s3s);

        System.out.println(CollectionUtils.intersection(list01,list02));
        // [Student{sid=3, sname='王五'}]

        System.out.println(CollectionUtils.union(list01,list02));
        // [Student{sid=2, sname='李四'}, Student{sid=1, sname='张三'}, Student{sid=3, sname='王五'}]

        System.out.println(CollectionUtils.subtract(list01,list02));
        // [Student{sid=1, sname='张三'}]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值