Java集合操作中的包含性判断:深入探讨List.contains()方法

文章目录

Java集合操作中的包含性判断:深入探讨List.contains()方法

问题分析与解答

1. 为什么list.contains(filterValueList)返回false?

在下面的代码片段中,list.contains(filterValueList)返回false的根本原因在于list.contains()方法的工作原理。这个方法是判断列表是否包含指定的元素 ,而不是判断列表是否包含另一个列表的所有元素。

让我们逐步拆解代码:

java 复制代码
String a = "["香蕉","苹果"]"; 
List<String> list = Arrays.asList("苹果", "香蕉"); 
List<String> filterValueList = JSONObject.parseArray(a, String.class); 
System.out.println("list.contains(filterValueList) = " + list.contains(filterValueList));

在这段代码中:

  • list["苹果", "香蕉"]
  • filterValueList["香蕉","苹果"]

list.contains(filterValueList)将尝试查找是否存在一个完全相同的列表对象,而不是检查列表中是否包含这些元素。因此返回false。

2. 正确的实现方法

方法一:使用containsAll()
java 复制代码
public class ListContainsExample {
    public static void main(String[] args) {
        // 方法1:使用containsAll()
       	String a = "["香蕉","苹果"]"; 
		List<String> list = Arrays.asList("苹果", "香蕉"); 
        List<String> filterValueList = JSONObject.parseArray(a, String.class);
        
        boolean containsAll = list.containsAll(filterValueList);
        System.out.println("list.containsAll(filterValueList) = " + containsAll);
    }
}
方法二:Stream流操作
java 复制代码
public class ListContainsExample {
    public static void main(String[] args) {
        // 方法2:Stream流操作
        String a = "["香蕉","苹果"]"; 
		List<String> list = Arrays.asList("苹果", "香蕉"); 
        List<String> filterValueList = JSONObject.parseArray(a, String.class);
        
        boolean allContained = filterValueList.stream()
            .allMatch(list::contains);
        System.out.println("Stream all match = " + allContained);
    }
}
方法三:传统循环
java 复制代码
public class ListContainsExample {
    public static void main(String[] args) {
        // 方法3:传统for循环
        String a = "["香蕉","苹果"]"; 
		List<String> list = Arrays.asList("苹果", "香蕉"); 
        List<String> filterValueList = JSONObject.parseArray(a, String.class);
        
        boolean allContained = true;
        for (String item : filterValueList) {
            if (!list.contains(item)) {
                allContained = false;
                break;
            }
        }
        System.out.println("Traditional loop = " + allContained);
    }
}
方法四:Set交集判断
java 复制代码
public class ListContainsExample {
    public static void main(String[] args) {
        // 方法4:Set交集判断
        String a = "["有风险","B"]";
        String a = "["香蕉","苹果"]"; 
		List<String> list = Arrays.asList("苹果", "香蕉"); 
        List<String> filterValueList = JSONObject.parseArray(a, String.class);
        
        Set<String> listSet = new HashSet<>(list);
        Set<String> filterSet = new HashSet<>(filterValueList);
        
        boolean fullyContained = listSet.containsAll(filterSet);
        System.out.println("Set containsAll = " + fullyContained);
    }
}

关键知识点总结

  1. list.contains():检查是否包含指定单个元素
  2. list.containsAll():检查是否包含另一个集合的所有元素
  3. Stream流:提供函数式的集合操作方式
  4. Set操作:可以快速进行集合的包含性判断

性能建议

  • 对于小规模集合,四种方法性能相近
  • 对于大规模集合:
    • Set方法性能最佳
    • Stream方法代码最简洁
    • 传统循环最直观
    • containsAll()最straightforward
相关推荐
L2ncE1 小时前
高并发场景数据与一致性的简单思考
java·后端·架构
武昌库里写JAVA1 小时前
使用 Java 开发 Android 应用:Kotlin 与 Java 的混合编程
java·vue.js·spring boot·sql·学习
小指纹1 小时前
河南萌新联赛2025第(六)场:郑州大学
java·开发语言·数据结构·c++·算法
叶~璃1 小时前
云计算:企业数字化转型的核心引擎
java
码luffyliu1 小时前
MySQL:MVCC机制及其在Java秋招中的高频考点
java·数据库·mysql·事务·并发·mvcc
程序员鱼皮1 小时前
这套 Java 监控系统太香了!我连夜给项目加上了
java·前端·ai·程序员·开发·软件开发
岁忧1 小时前
(nice!!!)(LeetCode 每日一题) 1277. 统计全为 1 的正方形子矩阵 (动态规划)
java·c++·算法·leetcode·矩阵·go·动态规划
S妖O风F2 小时前
IDEA报JDK版本问题
java·ide·intellij-idea
Mr. Cao code2 小时前
使用Tomcat Clustering和Redis Session Manager实现Session共享
java·linux·运维·redis·缓存·tomcat
纪莫2 小时前
DDD领域驱动设计的理解
java·ddd领域驱动设计