Java 代码优化:说“在循环体之外声明变量 在循环内使用 可以提高代码效率” 的测试

记得有过这个说法:在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里面装的是不是都是同一个对象。

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

https://blog.csdn.net/qq_27093465?viewmode=contents

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

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

可以得到是地址传递。

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

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

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

下面是测试的结果图

https://blog.csdn.net/qq_27093465?viewmode=contents

https://blog.csdn.net/qq_27093465?viewmode=contents

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

https://blog.csdn.net/qq_27093465?viewmode=contents

https://blog.csdn.net/qq_27093465?viewmode=contents

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

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

结论:

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

我就先给否了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值