获取两个List中的不同元素,4种方法,逐步优化,学习使用
完全复制https://www.cnblogs.com/czpblog/archive/2012/08/06/2625794.html
先上测试结果

代码
package com.syl.test; import java.util.*; /**
* 获取两个List的不同元素(假设List自身不存在重复元素)
* Created by syl on 2017/12/26 0026.
*/
public class TestCompareList {
public static void main(String[] args) {
List<String> list1 = new ArrayList<String>();
List<String> list2 = new ArrayList<String>();
for (int i = 0; i < 30000; i++) {
list1.add("test" + i);
}
for (int i = 0; i < 80000; i++) {
list2.add("test" + i * 2);
} getDiffrent1(list1, list2);
getDiffrent2(list1, list2);
getDiffrent3(list1, list2);
getDiffrent4(list1, list2);
} // 方法1,两层遍历查找,遍历次数为list1.size()*list2.size(),有点蠢
private static List<String> getDiffrent1(List<String> list1, List<String> list2) {
// diff 存放不同的元素
List<String> diff = new ArrayList<String>();
// 开始查找的时间,用于计时
long start = System.currentTimeMillis();
for (String str : list1) {
if (!list2.contains(str)) {
diff.add(str);
}
}
// 计时
System.out.println("方法1 耗时:" + (System.currentTimeMillis() - start) + " 毫秒");
return diff;
} // 方法2,两层遍历查找,用retainAll()方法查找,也很蠢,方法底层依旧是两层遍历
private static List<String> getDiffrent2(List<String> list1, List<String> list2) {
long start = System.currentTimeMillis();
list1.retainAll(list2);// 返回值是boolean
System.out.println("方法2 耗时:" + (System.currentTimeMillis() - start) + " 毫秒");
return list1;
} // 方法3,用Map存放List1和List2的元素作为key,value为其在List1和List2中出现的次数
// 出现次数为1的即为不同元素,查找次数为list1.size() + list2.size(),较方法1和2,是极大简化
private static List<String> getDiffrent3(List<String> list1, List<String> list2) {
List<String> diff = new ArrayList<String>();
long start = System.currentTimeMillis();
Map<String, Integer> map = new HashMap<String, Integer>(list1.size() + list2.size());
// 将List1元素放入Map,计数1
for (String string : list1) {
map.put(string, 1);
}
// 遍历List2,在Map中查找List2的元素,找到则计数+1;未找到则放入map,计数1
for (String string : list2) {
Integer count = map.get(string);
if (count != null) {
map.put(string, ++count);// 此处可优化,减少put次数,即为方法4
continue;
}
map.put(string, 1);
}
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() == 1) {
diff.add(entry.getKey());
}
}
System.out.println("方法3 耗时:" + (System.currentTimeMillis() - start) + " 毫秒");
return diff;
} // 优化方法3,减少put次数
private static List<String> getDiffrent4(List<String> list1, List<String> list2) {
List<String> diff = new ArrayList<String>();
long start = System.currentTimeMillis();
Map<String, Integer> map = new HashMap<String, Integer>(list1.size() + list2.size());
List<String> maxList = list1;
List<String> minList = list2;
if (list2.size() > list1.size()) {
maxList = list2;
minList = list1;
}
for (String string : maxList) {
map.put(string, 1);
}
for (String string : minList) {
Integer count = map.get(string);
if (count != null) {
map.put(string, ++count);
continue;
}
map.put(string, 1);
}
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() == 1) {
diff.add(entry.getKey());
}
}
System.out.println("方法4 耗时:" + (System.currentTimeMillis() - start) + " 毫秒");
return diff; } }
获取两个List中的不同元素,4种方法,逐步优化,学习使用的更多相关文章
- Python编程系列---获取请求报文行中的URL的几种方法总结
在浏览器访问web服务器的时候,服务器收到的是一个请求报文,大概GET请求的格式大概如下: 先随便拿到一个请求报文,蓝色即为我们要获取的 GET /index.html HTTP/1.1 Hos ...
- 有关《查找两个List中的不同元素》的问题解答与编程实践
郑海波 2013-07-08 问题: 有List<String> list1和List<String> list2,两个集合各有上万个元素,怎样查找两个集合中不同的元素呢? ...
- javascript 常见数组操作( 1、数组整体元素修改 2、 数组筛选 3、jquery 元素转数组 4、获取两个数组中相同部分或者不同部分 5、数组去重并倒序排序 6、数组排序 7、数组截取slice 8、数组插入、删除splice(需明确位置) 9、数组遍历 10、jQuery根据元素值删除数组元素的方)
主要内容: 1.数组整体元素修改 2. 数组筛选 3.jquery 元素转数组 4.获取两个数组中相同部分或者不同部分 5.数组去重并倒序排序 6.数组排序 7.数组截取slice 8.数组插入.删除 ...
- php获取两个数组相同的元素(交集)以及比较两个数组中不同的元素(差集)
(一)php获取两个数组相同元素 array array_intersect(array $array1, array $array2, [, array $...]) array array_ ...
- Java - Collection 高效的找出两个List中的不同元素
如题:有List<String> list1和List<String> list2,两个集合各有上万个元素,怎样取出两个集合中不同的元素? 方法1:遍历两个集合 public ...
- java中获取两个时间中的每一天
引入下面方法即可: /** * 获取两个时间中的每一天 * @param bigtimeStr 开始时间 yyyy-MM-dd * @param endTimeStr 结束时间 yyyy-MM-dd ...
- Java Collection - 003 高效的找出两个List中的不同元素
如题:有List<String> list1和List<String> list2,两个集合各有上万个元素,怎样取出两个集合中不同的元素? 方法1:遍历两个集合 public ...
- JS[获取两个日期中所有的月份]
//------[获取两个日期中所有的月份中] function getMonthBetween(start,end){ var result = []; var s = start.split(&q ...
- 【Java】获取两个字符串中最大相同子串
题目 获取两个字符串中最大相同子串 前提 两个字符串中只有一个最大相同子串 解决方案 public class StringDemo { public static void main(String[ ...
随机推荐
- 数独高阶技巧之八——SDC
在本系列的第四篇“简单异数链”中,向大家介绍了XY-Wing等一系列Wing类技巧,并提到可以用(拐弯的)数组的观念来理解这些结构,经过第六篇ALS的学习之后,大家回过头再去看Wing,应该可以发现相 ...
- centos7 minimal 安装mysql
CentOS 7.3.1611 安装 MySQL 2017年06月08日 23:02:08 阅读数:250 依赖 MySQL 依赖 libaio,所以先要安装 libaio yum search ...
- iis 部署webapi常见错误及解决方案
iis 部署webapi常见错误及解决方案 错误一: 原因:asp.net web api部署在Windows服务器上后,按照WebAPI定义的路由访问,老是出现404,但定义一个静态文件从站点访问, ...
- DIOCP (一) DIOCP常见问题。
1,IOCP是什么? 答:IOCP是windows下的服务器技术,并不是所有windows都能使用IOCP,只能在支持IOCP的windows操作系统上使用. 2,DIOCP是什么? 答:DIOCP是 ...
- todolist作业涉及知识点
window.event对象详细介绍 1.event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等.event对象只在事件发生的过程中才有效.event的某些属性只对特定 ...
- idea maven新建struts2项目
环境: IDEA java1.8 struts2-core 2.5.18 一路下一步,名字自己随便填, 项目建好后修改pom.xml文件,加入struts2-core 添加tomcat: +号添加w ...
- 【qbxt五一】day2
简单数据结构 入门题: 在初学OI的时候,总会遇到这么一道题. 给出N次操作,每次加入一个数,或者询问当前所有数的最大值. 维护一个最大值Max,每次加入和最大值进行比较. 时间复杂度O(N). 给出 ...
- kvm虚拟机静态迁移
1.静态迁移就是虚拟机在关机状态下,拷贝虚拟机虚拟磁盘文件与配置文件到目标虚拟主机中,实现的迁移. (1)虚拟主机各自使用本地存储存放虚拟机磁盘文件 本文实现基于本地磁盘存储虚拟机磁盘文件的迁移方式, ...
- HDU3183 贪心/RMQ-ST表
A Magic Lamp Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- Postman使用手册3——环境变量
一.环境变量 当使用API的时候,你可能经常需要使用不同的设置.环境设置可以让你使用变量自定义request.这个方法可以让你轻松的在不同的设置之间改变而不用改变你的request.你不需要担心要记住 ...