记得有过这个说法:在for循环之外,声明变量,然后再在for循环里面使用,这样的话,代码会好点。

那么这个说法OK不呢?

咱来测试一下,使用JProfiler来对比一下这个里面和外面的差别。

先看代码。

package com.lxk.commonTest; 
 
import com.google.common.collect.Lists; 
import com.lxk.model.Dog; 
import org.junit.Test; 
 
import java.util.List; 
 
/** 
 * 测试变量之间的相互引用 
 * 
 * @author LiXuekai on 2019/8/1 
 */ 
public class RefTest { 
    private static final int MAX = 5000; 
 
    public static void main(String[] args) { 
        while (true) { 
            //50% 
            inFor(); 
            //50% 
            outFor(); 
        } 
    } 
 
    @Test 
    public void whichIsFast() { 
        while (true) { 
            //50% 
            inFor(); 
            //50% 
            outFor(); 
        } 
    } 
 
    /** 
     * 这个对象在for里面还是外面声明,执行结果一致。list装的都是新new出来的对象。 
     */ 
    @Test 
    public void testObject() { 
        inFor(); 
        outFor(); 
    } 
 
    /** 
     * 在for之外声明个对象,在for里面循环赋值。 
     */ 
    private static void outFor() { 
        List<Dog> dogs = Lists.newArrayListWithExpectedSize(MAX); 
        int i = 0; 
        Dog dog; 
        while (i < MAX) { 
            dog = new Dog(i + "aaa", true, true); 
            dogs.add(dog); 
            i++; 
        } 
        //for (Dog d : dogs) { 
        //    System.out.println(d.getName()); 
        //} 
    } 
 
    /** 
     * 在for里面声明个对象,并赋值。 
     */ 
    private static void inFor() { 
        List<Dog> dogs = Lists.newArrayListWithExpectedSize(MAX); 
        int i = 0; 
        while (i < MAX) { 
            Dog dog = new Dog(i + "aaa", true, true); 
            dogs.add(dog); 
            i++; 
        } 
        //for (Dog d : dogs) { 
        //    System.out.println(d.getName()); 
        //} 
        //System.out.println(); 
    } 
} 

然后是执行结果的对比截图

1,首先是把MAX设置为5,看下对象在for循环之外声明的话,list里面装的是不是都是同一个对象。

额,也许老铁没这个疑惑,那就姑且一看吧。测试结果图

http://www.itno.cn/img2/d86cfb5e-3ca1-4443-a8cc-8aa488de227e.png

这个就是对这个“传值的操作是地址传递还是值传递”的一个验证。

结果,发现,就算在for循环之外声明变量,list里面装的都是各自是各自的对象,互不影响。

可以得到是地址传递。

list里面存的都是新对象的地址,跟for循环之外的对象关系不大。

2,然后,再比较下,在循环体之外声明变量和在循环体里面声明变量的效率差别。

这写了2个test方法,一个是直接main,一个是junit的test。

下面是测试的结果图

http://www.itno.cn/img2/d86cfb5e-3ca1-4443-a8cc-8aa488de227e.png

http://www.itno.cn/img2/d86cfb5e-3ca1-4443-a8cc-8aa488de227e.png

这个main方法的,可以看到稳稳地五五开。

http://www.itno.cn/img2/d86cfb5e-3ca1-4443-a8cc-8aa488de227e.png

http://www.itno.cn/img2/d86cfb5e-3ca1-4443-a8cc-8aa488de227e.png

这个junit的也是稳稳地五五开。

我为啥要弄2个呢,因为这个junit的test在JProfiler里面看到的太多了。然后就写了个main,看着少点,也清晰。

结论:

“在循环体之外声明变量,在循环内使用,可以提高代码效率”    ---------这个结论,不存在的嘛。

我就先给否了。


发布评论
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

jvm 内存区域详解知识解答
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。