前几天有人问过我一个问题,就是两个嵌套的循环执行效率的问题,问有什么好的办法替换。当时我想了想,实在想不起来,哎,惭愧! ! !请教了答案,恍然大悟。
比如:两个列表中分别装有相同的对象数据。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优化的循环嵌套的高效率方法