java如何取出两个arraylist同一位置的数进行比较_快速从2个List集合中找出相同/不同元素...

本文介绍了如何使用Apache Commons Collections库以及自定义Map方法来高效地比较和找出两个ArrayList在同一位置的不同元素。通过示例代码展示了在大数据量时,使用Map优化后的执行效率显著优于直接迭代比较。

最近刚好涉及到从2个不同集合中找出不同的元素的需求,以下为测试代码

1、利用 apache collection 工具内中的方法,附上坐标

commons-collections

commons-collections

3.2.1

collection 工具包中给出出了2个比较方便的工具方法

1、找共同的元素 org.apache.commons.collections.ListUtils.retainAll(Collection, Collection) 附上源码如下

public staticList removeAll(Collection collection, Collection remove) {

List list= newArrayList();for (Iterator iter =collection.iterator(); iter.hasNext();) {

Object obj=iter.next();if (remove.contains(obj) == false) {

list.add(obj);

}

}returnlist;

}

2、找出不同的元素 org.apache.commons.collections.ListUtils.removeAll(Collection, Collection) 附上源码如下

public staticList retainAll(Collection collection, Collection retain) {

List list= newArrayList(Math.min(collection.size(), retain.size()));for (Iterator iter =collection.iterator(); iter.hasNext();) {

Object obj=iter.next();if(retain.contains(obj)) {

list.add(obj);

}

}returnlist;

}

附上测试 demo 代码

public static voidmain(String[] args) {//生成集合1

List list1 =Lists.newArrayList();for (int i = 0; i < 100000; i++) {

list1.add(i);

}//生成集合 2

List list2 =Lists.newArrayList();for (int i = 0; i < 100001; i++) {

list2.add(i);

}long start =System.currentTimeMillis();//开始分离

List list =ListUtils.removeAll(list2, list1);long end =System.currentTimeMillis();

System.out.println(list);

System.out.println(end-start);//总执行次数 100000*100001

}

执行结果如下

[100000]4027

通过源码可以看出 集合迭代过程执行了100000*100001 次,随着数据量增加,速度将越来越慢,所以有了如下的优化方案, 付上代码

public static voidmain(String[] args) {//生成集合1

List list1 =Lists.newArrayList();for (int i = 0; i < 100000; i++) {

list1.add(i);

}//生成集合2

List list2 =Lists.newArrayList();for (int i = 0; i < 100001; i++) {

list2.add(i);

}long start =System.currentTimeMillis();//开始分离

Map map = new HashMap();for(Integer integer : list2) {

map.put(integer,1);

}for(Integer integer : list1) {

map.put(integer,2);

}

List list3 = new ArrayList();

Set> entrySet =map.entrySet();for (Entryentry : entrySet) {

Integer value=entry.getValue();if (Objects.equals(1, value)) {

list3.add(entry.getKey());

}

}//结束分离

long end =System.currentTimeMillis();

System.out.println(list3);

System.out.println(end-start);//总执行次数 100000+100001+100001

}

执行结果

[100000]33

差距非常明显,且我们分析执行次数可以看出,通过map执行迭代次数为100000+100001+100001 迭代次数减少很多,速度自然上来了

总结:当数据量不大的情况下,通过ListUtils.removeAll 的方式还是非常推荐,毕竟不用自己造轮子,但是如果数据量达到百万级以上时,推荐使用Map的方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值