集合contains和流anymatch的效率测试

本文探讨了在Java中从集合中判断是否存在特定元素的两种方法:使用contains方法和转换为流并使用anymatch方法。通过实践测试发现,contains方法在效率上优于流式anymatch。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

需要从集合中,判定是否含有某个元素。存在两种方式:
1.集合的contains,
2.转化为流的anymatch进行比较。

实践

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Hello world!
 *
 */
public class App 
{
	private static Logger logger = LoggerFactory.getLogger(App.class);
    public static void main( String[] args )
    {
    	//Stream的anyMatch和集合的contains哪个执行的快。
    	int end = 1000000;//集合范围
    	int skipValue = 10000;//每次查找的字符串间隔
    	int initValue = 0;//查找字符串初始值。
    	int rangend = end%skipValue>0?end/skipValue+1:end/skipValue;//求取遍历的范围。
    	IntStream.range(0, rangend).forEach(k ->{
    		String findstr = Integer.toString(initValue+k*skipValue);
    		List<String> collect = IntStream.range(0, end).mapToObj(i -> Integer.toString(i)).collect(Collectors.toList());
    		lo
### 如何在 Java 中检查两个集合的字段是否有重复项 为了检测两个集合中是否存在具有相同字段值的对象,可以利用 Java 8 的 Stream API 提供的功能来简化操作。以下是具体的方法: #### 使用 `Stream` `anyMatch` 方法 可以通过将其中一个集合转换为并使用 `anyMatch` 来查找另一个集合中存在的匹配项。假设我们需要基于 `name` 字段进行比较,则代码如下所示[^1]: ```java import java.util.*; import java.util.stream.Collectors; class Teacher { String name; public Teacher(String name) { this.name = name; } public String getName() { return name; } } class Student { String name; public Student(String name) { this.name = name; } public String getName() { return name; } } public class Main { public static void main(String[] args) { List<Teacher> teachers = Arrays.asList(new Teacher("Alice"), new Teacher("Bob")); List<Student> students = Arrays.asList(new Student("Charlie"), new Student("Alice")); boolean hasDuplicate = teachers.stream() .map(Teacher::getName) .anyMatch(name -> students.stream().map(Student::getName).collect(Collectors.toSet()).contains(name)); System.out.println(hasDuplicate); // 输出 true 表示存在重复名称 } } ``` 上述代码通过将教师学生的姓名映射到一个字符串集合上,并调用 `anyMatch` 判断是否至少有一个共同的名字。 --- #### 基于自定义类的字段去重 当需要根据多个字段判断重复时,可以考虑重写对象的 `equals()` `hashCode()` 方法[^3]。例如,在以下场景下,我们希望依据 `id` `name` 同时判定重复: ```java class Person { int id; String name; @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Person)) return false; Person person = (Person) o; return id == person.id && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(id, name); } } // 测试代码 List<Person> listA = ... ; List<Person> listB = ... ; boolean containsDuplicates = !Collections.disjoint(listA, listB); System.out.println(containsDuplicates ? "有重复" : "无重复"); ``` 这里借助了 `Collections.disjoint` 方法快速验证两组数据之间是否存在交集。 --- #### 结合 Set 数据结构优化性能 对于大规模的数据处理而言,频繁遍历可能会带来较高的时间复杂度 O(n²),因此推荐先构建辅助性的哈希表(如 HashSet),从而降低至线性级别的时间消耗[^5]。 ```java Set<String> teacherNames = teachers.stream().map(Teacher::getName).collect(Collectors.toSet()); long duplicateCount = students.stream() .filter(student -> teacherNames.contains(student.getName())) .count(); if (duplicateCount > 0) { System.out.println("发现重复条目:" + duplicateCount); } else { System.out.println("未找到任何重复记录!"); } ``` 此方式不仅提高了效率还保持逻辑清晰易读。 --- ### 总结 以上介绍了三种不同的策略用于解决 Java 集合间字段冲突探测问题——分别是运用 Lambda 函数配合条件筛选;针对多维度约束调整实体行为准则以及引入高效索引机制加速运算过程。每种方案各有优劣需视具体情况而定择取最适配的技术手段实施开发工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值