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

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

for(Member m2:list2){

if(m2.getName()==null){

for(Member m1:list1){

if(m1.getId().intValue()==m2.getId().intValue()){

System.out.println(m2.getId()+" Name 值为空!!!");

}

}

}

}

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

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

import java.util.ArrayList;

import java.util.Date;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.concurrent.TimeUnit;

class Member {

private Integer id;

private String name;

private Integer age;

private Date addDate;

public Member() {

}

public Member(Integer id, String name, Integer age, Date addDate) {

super();

this.id = id;

this.name = name;

this.age = age;

this.addDate = addDate;

}

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Integer getAge() {

return age;

}

public void setAge(Integer age) {

this.age = age;

}

public Date getAddDate() {

return addDate;

}

public void setAddDate(Date addDate) {

this.addDate = addDate;

}

}

public class For2 {

public static void main(String[] args) throws InterruptedException {

List list1 = new ArrayList<>();

List list2 = new ArrayList<>();

for(int i=0;i<30000;i++){

Date date = new Date();

list1.add(new Member((i+1),"技术客",(i+1), date));

if(i%2==0){

list2.add(new Member((i+1),null,(i+1), date));

}

}

//双for循环嵌套测试

long s1 = System.currentTimeMillis();

int forNumber = 0;

for(Member m2:list2){

if(m2.getName()==null){

for(Member m1:list1){

if(m1.getId().intValue()==m2.getId().intValue()){

// System.out.println(m2.getId()+" Name 值为空!!!");

forNumber++;

}

}

}

}

long s2 = System.currentTimeMillis();

System.out.println("双for循环查询时间为:"+(s2-s1)+"(毫秒),一共查询出"+forNumber+"条数据 \n\n\n");

TimeUnit.SECONDS.sleep(3);

//map查询测试

long s3 = System.currentTimeMillis();

int mapNumber = 0;

Map map = new HashMap<>();

for(Member m1:list1){

map.put(m1.getId(), m1);

}

for(Member m2:list2){

if(m2.getName()==null){

Member m = map.get(m2.getId());

if(m!=null){

// System.out.println(m2.getId()+" Name 值为空!!!");

mapNumber++;

}

}

}

long s4 = 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循环嵌套的高效率方法相关推荐

  1. java 堆大小的最大值_优化Java堆大小的5个技巧

    优化Java堆大小的5个技巧 摘要:Java堆容量不足可以对性能造成很大影响,这样无疑就给程序带来不可必要的麻烦,本文总结了影响Java堆容量不足的五大原因以及巧妙地去优化? 本文作者Pierre是一 ...

  2. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

  3. java动画闪烁_优化Java动画编程中的显示效果

    Java动画编程有多种实现方法,但它们实现的基本原理是一样的,即在屏幕上画出一系列的帧来造成运动的感觉.Java多线程技术是Java动画编程中普遍运用的技术,它在控制动画程序的流程和动画的显示效果方面 ...

  4. java 循环依赖_浅谈Spring解决循环依赖的三种方式

    引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...

  5. java迭代器和for循环区别_迭代器和增强for循环

    Iterator迭代器的使用: 迭代:Iterator,即collection集合元素的通用获取方式 java.util.Iterator接口.迭代器(对集合进行遍历) 有两个常用的方法 Boolea ...

  6. java while九九乘法表_用java实现三种方法循环输出九九乘法表:

    展开全部 for循环的结构:for(表达式 1:表达式 2:表达式  3) {  循环体  } 表达式 1:一般为赋值表达式:62616964757a686964616fe78988e69d83313 ...

  7. java课后习题七解析_《Java基础入门》_课后习题解析.doc

    <Java基础入门>_课后习题解析 <Java基础入门>课后习题 Java开发入门 一.填空题 1.Java的三大体系分别是_JavaSE_____._JavaEE_____. ...

  8. java课后习题及答案_《java基础入门》课后习题及答案.doc

    <java基础入门>课后习题及答案.doc <Java 基础入门>课后习题及答案博学谷--让 IT 教学更简单,让 IT 学习更有效<Java 基础入门> 课后习题 ...

  9. asp java 变量_ASP_用stack变量优化Java代码,  java程序包含了大量的对象 - phpStudy...

    用stack变量优化Java代码 java程序包含了大量的对象,我们需要了解它们是从哪里被访问的,变量存储于何处对程序的性能有显著的影响--尤其是某些需要被频繁访问的变量. 我们写一个Java类,在其 ...

最新文章

  1. 服膺守善 立德立言——院长王建民教授在清华大学软件学院2020届学生毕业典礼上的赠言...
  2. 异步多线程(五)多线程异常处理
  3. Keras【Deep Learning With Python】keras框架下的MNIST数据集训练及自己手写数字照片的识别(分类神经网络)
  4. 转:TestLink1.9.3测试用例:Excel转换XML工具二实现代码
  5. DB2: 为DB2数据库创建新用户帐户并为其分配特定特权
  6. Oracle 基础系列之1.1 oracle的安装
  7. Caffe + ROS + OpenCV + Qt creator
  8. linux 如何格式化ext2,Linux的Ext2文件系统(InodeBlock)详解
  9. crt怎么退出编辑模式_securecrt怎么退出当前指令
  10. C语言版数据结构计算顺序表中X的个数,设计算法。数据结构课后习题,定义顺序表,查找顺序表中X元素的个数。
  11. 2009福布斯中国上市公司最佳CEO榜
  12. ECU存储安全之存储器安全
  13. html字大小自适应,html字体大小自适应 怎样让HTML字体自适应到移动端?
  14. 微信支付/退费(服务商)模式
  15. C# 调用Everything查找文件
  16. 若依(ruoyi)框架关闭当前标签页
  17. 第一次亲密接触(3)
  18. http://f.lefeng.com/u/36033580/detail/r/t/tid/1010
  19. 第12期《乘风破浪》2月刊
  20. multisim仿真 电流控制的电压源电路连接方法

热门文章

  1. 自己编写jQuery动态引入js文件插件 (jquery.import.dynamic.script)
  2. linux kill信号列表
  3. python之if和while控制流
  4. 压力测试对于BCH真的有意义吗?
  5. 三种方法实现CSS三栏布局
  6. Groovy 和 Gradle
  7. UI_UITableView_搭建
  8. web开发小记2:js触发css过渡
  9. crm客户资源显示控制
  10. Windows 10 技术预览