在Java中,从List A中找出List B没有的数据(即求差集)

方法 核心思路 优点 缺点 适用场景
循环遍历​ 遍历A,检查元素是否不在B中 逻辑简单直观 性能较差(O(n*m)) 小数据量,注重代码可读性
Stream API​ 使用Stream的filter进行声明式处理 代码简洁,函数式风格 包含检查性能依赖底层集合 常用推荐,代码简洁性要求高
HashSet优化​ 将B转为HashSet,利用O(1)查找 性能最佳(约O(n)) 有转换开销,不保持顺序 大数据量,对性能要求高
**removeAll**​ 直接修改A,移除B中也有的元素 代码极简(一行) 直接修改原集合A​ 确定可修改原集合,且不需保留原顺序

下面我们通过具体代码示例来详细了解每种方法。

循环遍历

这是最基础的方法,通过循环遍历列表A,并判断每个元素是否不在列表B中。

复制代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ListDifference {
    public static void main(String[] args) {
        List<String> a = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry", "Date"));
        List<String> b = new ArrayList<>(Arrays.asList("Banana", "Date", "Fig"));
        
        List<String> result = new ArrayList<>();
        
        for (String item : a) {
            if (!b.contains(item)) {
                result.add(item);
            }
        }
        
        System.out.println("A有B无的元素(循环遍历): " + result); // 输出: [Apple, Cherry]
    }
}

Stream API

利用Java 8的Stream API,可以写出更简洁、更函数式的代码。

复制代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class ListDifference {
    public static void main(String[] args) {
        List<String> a = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry", "Date"));
        List<String> b = new ArrayList<>(Arrays.asList("Banana", "Date", "Fig"));
        
        List<String> result = a.stream()
                               .filter(item -> !b.contains(item))
                               .collect(Collectors.toList());
        
        System.out.println("A有B无的元素(Stream): " + result); // 输出: [Apple, Cherry]
    }
}

HashSet优化

当数据量较大时,先将列表B转换为HashSet可以大幅提升查找效率。

复制代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class ListDifference {
    public static void main(String[] args) {
        List<String> a = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry", "Date"));
        List<String> b = new ArrayList<>(Arrays.asList("Banana", "Date", "Fig"));
        
        // 将List B转换为HashSet
        Set<String> setB = new HashSet<>(b);
        
        List<String> result = a.stream()
                               .filter(item -> !setB.contains(item))
                               .collect(Collectors.toList());
        
        System.out.println("A有B无的元素(HashSet优化): " + result); // 输出: [Apple, Cherry]
    }
}

使用 removeAll

List的removeAll方法会直接修改原列表,使用前需谨慎。

复制代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ListDifference {
    public static void main(String[] args) {
        List<String> a = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry", "Date"));
        List<String> b = new ArrayList<>(Arrays.asList("Banana", "Date", "Fig"));
        
        // 创建a的副本,避免修改原列表
        List<String> aCopy = new ArrayList<>(a);
        aCopy.removeAll(b);
        
        System.out.println("原列表A未被修改: " + a); // 输出: [Apple, Banana, Cherry, Date]
        System.out.println("A有B无的元素(removeAll): " + aCopy); // 输出: [Apple, Cherry]
        
        // 如果确定要修改原列表A,可以直接使用:a.removeAll(b);
        // a.removeAll(b);
        // System.out.println("修改后的列表A: " + a); // 输出: [Apple, Cherry]
    }
}
相关推荐
棉猴几秒前
玩游戏学Python5-函数
开发语言·python·函数·玩游戏·游戏编程
Rain的Java大神之路2 分钟前
[特殊字符]8年Java老兵转型AI Agent:90%的人挂在同一个坑,根本不用学Python!(万字实战复盘,建议收藏)
java·数据库·人工智能·后端·python·spring·ai编程
高级程序源16 分钟前
springboot本地生活服务平台33399-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·小程序·flask·课程设计
高级程序源21 分钟前
springboot社区旧物回收管理系统25381-计算机课程设计、毕业设计
vue.js·spring boot·python·django·课程设计
高级程序源23 分钟前
springboot大学生体测系统72170-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
谢亮_vipxieliang28 分钟前
JavaScript this 指向完全指南:调用位置决定一切
开发语言·javascript·ecmascript
denlaku33 分钟前
JDK 13 新特性详解
java·开发语言
打工仔折腾 AI36 分钟前
极空间用 Docker 部署 Photopea:网页版 PS 的私有化实践
运维·后端·python·docker·容器·langchain·ai agent 实战
Eiceblue44 分钟前
使用 Python 实现 Excel 行列转置(保留单元格样式)
前端·python·excel
念越1 小时前
题库、练习与错题本代码阅读
开发语言·数据结构