list去重的两种方法大比拼

有两个存储10000数据的list(LinkedList A和 LinkedList B)要去重,有两种方法:

方法一:

把两个list都放到一个HashSet里面,然后for循环转化回LinkedList。

方法二:

A.removeAll(B);

A.addAll(B);

上面两种方法,哪种效率更好呢?下面我们来让两种方法做一个大比拼:

public class ListRemovePKSet {
	public static void main(String[] args) {	
    Long setCost=setFor();
     Long listCost=listRemove();
     if(setCost<listCost){
     System.out.println("set大获全胜");
     }else if(setCost<listCost){
     System.out.println("list大获全胜");
     }else{
     System.out.println("set和list势均力敌");
     }
	}
	public static Long setFor(){
		List<Long> ids = new LinkedList<Long>();
		List<Long> listIds1 = new LinkedList<Long>();
		List<Long> listIds2 = new LinkedList<Long>();
		Long num=1L;
		for(int i=0;i<10000;i++){
			listIds1.add(num++);
		}
		listIds1.add(1000001L);
		num=1L;
		Long begin=System.currentTimeMillis();
		Set<Long> set = new HashSet<Long>();
		set.clear();
		set.addAll( listIds1 );
		set.addAll( listIds2 );
		for (Long brandId : set) {  
			ids.add(brandId);
		} 
		Long cost=System.currentTimeMillis()-begin;
		System.out.println("set花费时间:"+cost);
		System.out.println("list长度:"+ids.size());
		return cost;
	}
	public static Long listRemove(){
		List<Long> listIds1 = new LinkedList<Long>();
		List<Long> listIds2 = new LinkedList<Long>();
		Long num=1L;
		for(int i=0;i<10000;i++){
			listIds1.add(num++);
		}
		listIds1.add(1000001L);
		num=1L;
		for(int i=0;i<10000;i++){
			listIds2.add(num++);
		}
		Long begin=System.currentTimeMillis();
		listIds1.removeAll(listIds2);
		listIds1.addAll(listIds2);
		Long cost=System.currentTimeMillis()-begin;
		System.out.println("listRemove花费时间:"+cost);
		System.out.println("list长度:"+listIds1.size());
		return cost;
	}
}
 

结果:

set花费时间:5
list长度:10001
listRemove花费时间:298
list长度:10001
set大获全胜

由此可见,用set去重的效率高很多。

其实这是因为list.RemoveAll的原理是对链表进行遍历比较来去重的,所以效率不高。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值