日期:2014-05-19  浏览次数:20654 次

关于JAVA for循环效率的问题
今天在C#里面看到:
之前一直认为
for (int i = 0, h = arr.Count; i < h; i++)

for (int i = 0; i < arr.Count; i++)
两种写法,在C#里应该是差不多的,今天突然有人问,就写了个程序测试了一下,结果出乎我的意料
如果arr是List<T>,前者的效率比后者高大约一倍,如果arr是string[],两者效率基本差不多

原帖子地址:http://topic.csdn.net/u/20120706/16/CEB33682-FF71-402C-9FE9-580F5ECFDFC1.html

我写的代码测试:int tnum = 1000000; // 添加或查找的次数
int outnum = 10; // 外层循环次数
ArrayList<String> arr = new ArrayList<String>();
for (int i = 0; i < tnum; i++) {
arr.add(Integer.toString(i));
}
String[] arr2 = new String[tnum];
for(int j=0;j<outnum;j++)
{
Long time = System.currentTimeMillis();
String msg;
msg = "Number ";
for (int i = 0, h = arr.size(); i < h; i++)
{
}
time = System.currentTimeMillis()-time;
System.out.println(msg+"耗时:"+time);

msg = ".Count ";
time = System.currentTimeMillis();
for (int i = 0; i < arr.size(); i++)
{
}
time = System.currentTimeMillis()-time;
System.out.println(msg+"耗时:"+time);

msg = "Length ";
time = System.currentTimeMillis();
for (int i = 0; i < arr2.length; i++)
{
}
time = System.currentTimeMillis()-time;
System.out.println(msg+"耗时:"+time);
}
我发现时间都差不多啊,难道是因为ArrayList的原因?还是JAVA这个用的时间本来就是一样的?

------解决方案--------------------
LZ这样比较是很难看出来的,还是查看伪代码指令比较好理解
Java code
import java.util.*;
public class jp {
    public static void main(String[] args) throws Throwable {
        List<String> list = new ArrayList<String>();
        for (int i=0, j=list.size(); i<j; i++); //list.size()只调用一次
        for (int i=0; i<list.size(); i++); //list.size()每次都调用
    }
}