文章目录
- 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);
}
}
关键知识点总结
list.contains()
:检查是否包含指定单个元素list.containsAll()
:检查是否包含另一个集合的所有元素- Stream流:提供函数式的集合操作方式
- Set操作:可以快速进行集合的包含性判断
性能建议
- 对于小规模集合,四种方法性能相近
- 对于大规模集合:
- Set方法性能最佳
- Stream方法代码最简洁
- 传统循环最直观
containsAll()
最straightforward