记得有过这个说法:在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里面装的是不是都是同一个对象。
额,也许老铁没这个疑惑,那就姑且一看吧。测试结果图
这个就是对这个“传值的操作是地址传递还是值传递”的一个验证。
结果,发现,就算在for循环之外声明变量,list里面装的都是各自是各自的对象,互不影响。
可以得到是地址传递。
list里面存的都是新对象的地址,跟for循环之外的对象关系不大。
2,然后,再比较下,在循环体之外声明变量和在循环体里面声明变量的效率差别。
这写了2个test方法,一个是直接main,一个是junit的test。
下面是测试的结果图
这个main方法的,可以看到稳稳地五五开。
这个junit的也是稳稳地五五开。
我为啥要弄2个呢,因为这个junit的test在JProfiler里面看到的太多了。然后就写了个main,看着少点,也清晰。
结论:
“在循环体之外声明变量,在循环内使用,可以提高代码效率” ---------这个结论,不存在的嘛。
我就先给否了。