前几天有人问过我一个问题,就是两个嵌套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循环的资料请关注萬仟网其它相关文章!
如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!