省流:数据量在1000以上的用map取交集效率更好。

省流:数据量在1000以上的用map取交集效率更好。


代码

List<String> list1 = new ArrayList<>();
for (int i = 0; i < 100000; i += Math.random() * 10 + 1) {
    list1.add(i + "aa");
}
List<String> list2 = new ArrayList<>();
for (int i = 0; i < 100000; i += Math.random() * 10 + 1) {
    list2.add(i + "aa");
}
// 方法1,利用list自带的contains
begin = System.currentTimeMillis();
List<String> list3 = list1.stream().filter(list2::contains).collect(Collectors.toList());
end = System.currentTimeMillis();
System.out.println("集合1大小:" + list1.size() + ", 集合2大小:" + list2.size() + ", 交集所需时间:" + (end - begin) + "毫秒");

// 方法2,利用map去重
begin = System.currentTimeMillis();
Map<String, String> map1 = list1.stream().collect(Collectors.toMap(s -> s, Function.<String>identity()));
List<String> list4 = list2.stream().filter(v -> map1.get(v) != null).collect(Collectors.toList());
end = System.currentTimeMillis();
System.out.println("集合1大小:" + list1.size() + ", 集合2大小:" + list2.size() + ", 交集所需时间:" + (end - begin) + "毫秒");

几组结果

集合1大小:19985, 集合2大小:22079, contains方法取交集所需时间:3004毫秒
集合1大小:19985, 集合2大小:22079, map方法取交集所需时间:20毫秒

集合1大小:19996, 集合2大小:22089, contains方法取交集所需时间:1734毫秒
集合1大小:19996, 集合2大小:22089, map方法取交集所需时间:12毫秒

集合1大小:19969, 集合2大小:22333, contains方法取交集所需时间:1720毫秒
集合1大小:19969, 集合2大小:22333, map方法取交集所需时间:9毫秒

集合1大小:20027, 集合2大小:22162, contains方法取交集所需时间:1738毫秒
集合1大小:20027, 集合2大小:22162, map方法取交集所需时间:8毫秒

集合1大小:20138, 集合2大小:22124, contains方法取交集所需时间:1679毫秒
集合1大小:20138, 集合2大小:22124, map方法取交集所需时间:11毫秒