定义为:
Collection<E> c;
Iterator<E> iter = c.iterator();现在要求对c中的元素进行遍历,下面两种,哪种效率更高?为什么?1
while(iter.hasNext()) {
    E temp = iter.next();
    // some operations
}2
E temp;
while(iter.hasNext()) {
    temp = iter.next();
    // some operations
}

解决方案 »

  1.   

    1的栈操作应该多一些,但不会带来很大的性能损失。
    不过2的好处是让temp的作用域限制在循环之内,如果循环后用不到temp了,我会选择2这样的写法。
      

  2.   

    profile的结果貌似差别不大。。
      

  3.   

    我认为下面这种方式更好,同时限制了迭代器的局部变量作用域。for(Iterator<E> i = c.iterator(); i.hasNext(); ) {
        E temp = i.next();
    }
      

  4.   

    通过对代码的profiling,发现,两者在内存分配上差别几乎可以忽略不计。分配的对象个数一样多。两者在时间上也基本没有差别。也就是说,定义Integer放在循环内外,基本没区别。  for (int k = 0; k < 10000; k++) {
                Integer temp = new Integer(k);
            }和  Integer temp;
            for (int k = 0; k < 10000; k++) {
                temp = new Integer(k);
            }
      

  5.   

    完全没有必要抠到这么细不过我喜欢1,因为temp每次都是新的
      

  6.   

    第一个好,编程少写了temp;这几个字符:)
      

  7.   

    给你们再做个测试,看看会得到什么结果List l = new ArrayList();POJO p;
    for (int i=0; i<10; i++) {
        p = new POJO;
        l.add(p);
    }
    for (int i=0; i<10; i++) {
        POJO p = new POJO;
        l.add(p);
    }看看得到的这两个LIST内容有什么区别没有...
      

  8.   

    我不知道pojo是啥。。只好用Integer代替了,打出来是一样的东西
      

  9.   

    这种代码有比较意义没?还谈什么效率呀,第二个顶多在函数里多了4个字节的引用,第一个只是在for里面每次增加4个字节的引用(在没被GC之前)。要论效率,肯定是第二个要高点点,但是没意义,并且对栈的操作次数是一样的。