Java优化的循环嵌套的高效率方法

  

前几天有人问过我一个问题,就是两个嵌套的循环执行效率的问题,问有什么好的办法替换。当时我想了想,实在想不起来,哎,惭愧! ! !请教了答案,恍然大悟。

  

比如:两个列表中分别装有相同的对象数据。list1中万有3条对象数据。用于中万有2条对象数据(但是对象中的某个属性变量为空)。两个列表中的id或者其他变量都一模一样。请用最快的方式找出用于中变量为空的那个对象,并且去list1中找出id相同的对象。或者可以理解成,从用于中找出变量为空的,去list1中找出对应的对象,然后把为空的列补上。总之就是这么一个意思,先对循环用于,判断一下每个对象的那个属性变量是否为空,如果为空,再去为循环list1,找出id一样的对象,就算执行成功了。

  

那么请看下边的为循环嵌套的解决方式:

        (成员m2:用于){   如果(m2.getName ()==null) {   (成员m1: list1) {   如果(m1.getId () .intValue ()==m2.getId () .intValue ()) {   System.out.println (m2.getId() +”名称值为空! ! !”);   }   }   }   }   之前      

这样真的好吗?如果有上万,甚至十几万的数据,那么这个执行效率问题,我就不多说了。非常非常的慢。

  

下边来看使用地图代替的执行方式,以及两种方式的效率对比:

        进口java.util.ArrayList;   进口java.util.Date;   进口java.util.HashMap;   进口并不知道;   进口java.util.Map;   进口java.util.concurrent.TimeUnit;      类成员{   私人整数id;   私人字符串名称;   私人整数年龄;   私人addDate日期;      公共成员(){   }      公共成员(整数id字符串名称,整数年龄,日期addDate) {   超级();   这一点。id=id;   this.name=名称;   这一点。年龄=年龄;   这一点。addDate=addDate;   }      公共整数getId () {   返回id;   }      公共空间setId(整数id) {   这一点。id=id;   }      公共字符串getName () {   返回名称;   }      公共空间setName(字符串名称){   this.name=名称;   }      公共整数getAge () {   返回年龄;   }      公共空间setAge(整数年龄){   这一点。年龄=年龄;   }      上市日期getAddDate () {   返回addDate;   }      公共空间setAddDate(日期addDate) {   这一点。addDate=addDate;   }      }      公开课于{      公共静态void main (String [] args)抛出InterruptedException {   List,list1=new ArrayList<的在();   List,用于=new ArrayList<的在();   for (int i=0; i<30000;我+ +){   日期日期=new日期();   。添加(新成员((i + 1),“技术客”,(i + 1),日期));   如果(我% 2==0){   用于。添加(新成员((i + 1), null, (i + 1),日期));   }   }//双循环嵌套测试   长s1=System.currentTimeMillis ();   int forNumber=0;   (成员m2:用于){   如果(m2.getName ()==null) {   (成员m1: list1) {   如果(m1.getId () .intValue ()==m2.getId () .intValue ()) {//System.out.println (m2.getId() +”名称值为空! ! !”);   forNumber + +;   }   }   }   }   长s2=System.currentTimeMillis ();   System.out.println(“双循环查询时间为:" + (s2-s1) +”(毫秒),一共查询出“+ forNumber +“条数据\ n \ n \ n”);   TimeUnit.SECONDS.sleep (3);//地图查询测试   长s3=System.currentTimeMillis ();      int mapNumber=0;   Member> Map<整数;地图=new HashMap<在();   (成员m1: list1) {   map.put (m1.getId ()、m1);   }   (成员m2:用于){   如果(m2.getName ()==null) {   m=map.get成员(m2.getId ());   如果(m !=null) {//System.out.println (m2.getId() +”名称值为空! ! !”);   mapNumber + +;   }   }   }   长s4=System.currentTimeMillis ();   System.out.println(“使用地图结构查询时间为:" + (s4-s3) +”(毫秒),一共查询出“+ mapNumber +“条数据\ n \ n \ n”);   }      }   之前      

输出结果:

  
  

双为循环查询时间为:1578(毫秒),一共查询出15000条数据
  
  
  
  使用地图结构查询时间为:14(毫秒),一共查询出15000条数据

     

如果我们模拟10万条数据,然后其中五千条重复数据的情况下:效率更是天壤之别。

  

看输出结果:

  
  

Java优化的循环嵌套的高效率方法