入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

list去重的两种方法大比拼

创建时间:2014-07-16 投稿人: 浏览次数:1704

有两个存储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的原理是对链表进行遍历比较来去重的,所以效率不高。

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像