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
相关推荐
NE_STOP6 小时前
MyBatis-配置文件解读及MyBatis为何不用编写Mapper接口的实现类
java
后端AI实验室11 小时前
用AI写代码,我差点把漏洞发上线:血泪总结的10个教训
java·ai
程序员清风13 小时前
小红书二面:Spring Boot的单例模式是如何实现的?
java·后端·面试
belhomme13 小时前
(面试题)Redis实现 IP 维度滑动窗口限流实践
java·面试
Be_Better13 小时前
学会与虚拟机对话---ASM
java
开源之眼15 小时前
《github star 加星 Taimili.com 艾米莉 》为什么Java里面,Service 层不直接返回 Result 对象?
java·后端·github
Maori31616 小时前
放弃 SDKMAN!在 Garuda Linux + Fish 环境下的优雅 Java 管理指南
java
用户9083246027317 小时前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
小王和八蛋17 小时前
DecimalFormat 与 BigDecimal
java·后端
beata17 小时前
Java基础-16:Java内置锁的四种状态及其转换机制详解-从无锁到重量级锁的进化与优化指南
java·后端