java 嵌套for循环优化_Java优化for循环嵌套的高效率方法

本文探讨了如何优化Java中嵌套for循环的执行效率,通过对比传统双for循环与使用HashMap的数据结构,展示了在大量数据情况下,使用HashMap的巨大优势。在示例中,对于3万条和2万条数据的两个列表,查找并填充空值对象的属性,使用HashMap的查询时间仅为双for循环的千分之一。这表明,当数据量增大时,利用合适的数据结构可以显著提高代码执行速度。
摘要由CSDN通过智能技术生成

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

比如:两个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: 三层for循环可以用来遍历三维数组,并执行指定的操作。它的格式如下:for (int i = 0; i < array.length; i++) { for (int j = 0; j < array[i].length; j++) { for (int k = 0; k < array[i][j].length; k++) { // do something } } } ### 回答2: Java的三层循环可以用来处理多重嵌套的问题。三层for循环由三个嵌套循环组成,每个循环控制一个迭代变量,用于遍历不同的范围。下面是一个简单的例子来说明如何使用三层for循环。 ```java for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k < 3; k++) { System.out.println("i: " + i + " j: " + j + " k: " + k); } } } ``` 上述代码将会输出如下内容: ``` i: 0 j: 0 k: 0 i: 0 j: 0 k: 1 i: 0 j: 0 k: 2 i: 0 j: 1 k: 0 i: 0 j: 1 k: 1 i: 0 j: 1 k: 2 i: 0 j: 2 k: 0 i: 0 j: 2 k: 1 i: 0 j: 2 k: 2 i: 1 j: 0 k: 0 i: 1 j: 0 k: 1 i: 1 j: 0 k: 2 i: 1 j: 1 k: 0 i: 1 j: 1 k: 1 i: 1 j: 1 k: 2 i: 1 j: 2 k: 0 i: 1 j: 2 k: 1 i: 1 j: 2 k: 2 i: 2 j: 0 k: 0 i: 2 j: 0 k: 1 i: 2 j: 0 k: 2 i: 2 j: 1 k: 0 i: 2 j: 1 k: 1 i: 2 j: 1 k: 2 i: 2 j: 2 k: 0 i: 2 j: 2 k: 1 i: 2 j: 2 k: 2 ``` 上述代码中,外层的循环控制变量i,中间层的循环控制变量j,而内层的循环控制变量k。通过嵌套循环,我们可以遍历不同的范围,并执行相应的操作。这个简单的例子展示了三层for循环的用法和输出结果。实际上,我们可以根据实际需求来嵌套更多层的for循环,以处理更复杂的问题。 ### 回答3: Java 三层for循环是指在Java编程语言中使用三个嵌套的for循环语句。这种循环可以让我们在嵌套循环中进行更高级的迭代操作,对多维数据结构进行遍历和处理。 三层for循环的基本语法如下: ```java for (初始化语句1; 循环条件1; 迭代语句1) { for (初始化语句2; 循环条件2; 迭代语句2) { for (初始化语句3; 循环条件3; 迭代语句3) { // 循环体代码 } } } ``` 三层for循环可以用来解决一些复杂的问题,比如遍历二维数组或多维数组。通过嵌套循环,我们可以逐个遍历数组中的所有元素,对每个元素进行操作。 例如,假设我们有一个二维数组arr,我们可以使用三层for循环遍历数组中的所有元素: ```java int[][] arr = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { System.out.println(arr[i][j]); } } ``` 上述代码会输出数组中的所有元素:1、2、3、4、5、6、7、8、9。 另外,三层for循环也可以用于处理其他类似的问题,比如生成某种特定模式的输出等。 需要注意的是,三层for循环可能会导致嵌套层数过多,代码可读性下降,且执行效率可能较低,所以在实际应用中需要根据具体情况进行合理使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值