Java优化for循环嵌套的高效率方法
前几天有人问过我一个问题,就是两个嵌套for循环执行效率的问题,问有什么好的办法替换。当时我想了想,实在想不起来,哎,惭愧!!!请教了答案,恍然大悟。
比如:两个list中分别装有相同的对象数据。list1中有3万条对象数据。list2中有2万条对象数据(但是对象中的某个属性变量为空)。两个list中的id或者其他变量都一模一样。请用最快的方式找出list2中变量为空的那个对象,并且去list1中找出id相同的对象。或者可以理解成,从list2中找出变量为空的,去list1中找出对应的对象,然后把为空的列补上。总之就是这么一个意思,先for循环list2,判断一下每个对象的那个属性变量是否为空,如果为空,再去for循环list1,找出id一样的对象,就算执行成功了。
那么请看下边的for循环嵌套的解决方式:
for(Memberm2:list2){ if(m2.getName()==null){ for(Memberm1:list1){ if(m1.getId().intValue()==m2.getId().intValue()){ System.out.println(m2.getId()+"Name值为空!!!"); } } } }
这样真的好吗?如果有上万,甚至十几万的数据,那么这个执行效率问题,我就不多说了。非常非常的慢。
下边来看使用map代替的执行方式,以及两种方式的效率对比:
importjava.util.ArrayList; importjava.util.Date; importjava.util.HashMap; importjava.util.List; importjava.util.Map; importjava.util.concurrent.TimeUnit; classMember{ privateIntegerid; privateStringname; privateIntegerage; privateDateaddDate; publicMember(){ } publicMember(Integerid,Stringname,Integerage,DateaddDate){ super(); this.id=id; this.name=name; this.age=age; this.addDate=addDate; } publicIntegergetId(){ returnid; } publicvoidsetId(Integerid){ this.id=id; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicIntegergetAge(){ returnage; } publicvoidsetAge(Integerage){ this.age=age; } publicDategetAddDate(){ returnaddDate; } publicvoidsetAddDate(DateaddDate){ this.addDate=addDate; } } publicclassFor2{ publicstaticvoidmain(String[]args)throwsInterruptedException{ Listlist1=newArrayList<>(); List list2=newArrayList<>(); for(inti=0;i<30000;i++){ Datedate=newDate(); list1.add(newMember((i+1),"技术客",(i+1),date)); if(i%2==0){ list2.add(newMember((i+1),null,(i+1),date)); } } //双for循环嵌套测试 longs1=System.currentTimeMillis(); intforNumber=0; for(Memberm2:list2){ if(m2.getName()==null){ for(Memberm1:list1){ if(m1.getId().intValue()==m2.getId().intValue()){ //System.out.println(m2.getId()+"Name值为空!!!"); forNumber++; } } } } longs2=System.currentTimeMillis(); System.out.println("双for循环查询时间为:"+(s2-s1)+"(毫秒),一共查询出"+forNumber+"条数据\n\n\n"); TimeUnit.SECONDS.sleep(3); //map查询测试 longs3=System.currentTimeMillis(); intmapNumber=0; Map map=newHashMap<>(); for(Memberm1:list1){ map.put(m1.getId(),m1); } for(Memberm2:list2){ if(m2.getName()==null){ Memberm=map.get(m2.getId()); if(m!=null){ //System.out.println(m2.getId()+"Name值为空!!!"); mapNumber++; } } } longs4=System.currentTimeMillis(); System.out.println("使用map结构查询时间为:"+(s4-s3)+"(毫秒),一共查询出"+mapNumber+"条数据\n\n\n"); } }
输出结果:
双for循环查询时间为:1578(毫秒),一共查询出15000条数据
使用map结构查询时间为:14(毫秒),一共查询出15000条数据
如果我们模拟10万条数据,然后其中五千条重复数据的情况下:效率更是天壤之别。
看输出结果:
双for循环查询时间为:30929(毫秒),一共查询出50000条数据
使用map结构查询时间为:24(毫秒),一共查询出50000条数据
循环数据越小,两者差别也就越小,但是数据量越大,差别也就越大。10万条数据的差别竟然达到上千倍!
以上就是Java优化for循环嵌套的高效率方法的详细内容,更多关于Java优化for循环的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。