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<>();
Listlist2=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;
Mapmap=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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。