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
相关推荐
曹牧11 分钟前
JSON 数组的正确使用方式
java·服务器·前端
LINgZone211 分钟前
深入解析:Cglib与JDK动态代理的实现原理、区别及性能对比
java·开发语言
华科易迅19 分钟前
Spring JDBC
java·后端·spring
云烟成雨TD35 分钟前
Spring AI 1.x 系列【17】函数型工具开发与使用
java·人工智能·spring
IT小哥哥呀39 分钟前
基于windows的个人/团队的时间管理工具
windows·c#·wpf·时间管理
云烟成雨TD1 小时前
Spring AI 1.x 系列【15】AI Agent 基石:Tool Calling 标准与 Spring AI 集成
java·人工智能·spring
咸鱼2.01 小时前
【java入门到放弃】杂记
java·开发语言
亦暖筑序1 小时前
《Spring AI 实战系列 入门篇》第 3 篇
java
Memory_荒年1 小时前
Netty:从“网络搬砖”到“流水线大师”的奇幻之旅
java·后端
ChaseDreamRunner2 小时前
如何用 NSSM 把 Jar 做成 Windows 服务
java·windows·jar