比如:
UserVo userVo = null;
while(iterator.hasNext()){
  userVo = it.next();
  ...
}
与这种
while(iterator.hasNext()){
  UserVo userVo = it.next();
  ...
}
除了作用域,在内存中会有什么区别
我想知道第二种方式会不会重新分配引用,造成栈空间浪费
这两种方式在效率上是否有差别

解决方案 »

  1.   

    上面为伪代码,大家不要介意
    iterator和it是一回事...
    大家看懂大意就好
      

  2.   

    应该是第一种方式节省内存,UserVo userVo=null 只申请一次内存空间
    而第二种每次都  UserVo userVo = it.next(); 每次都申请内存空间
      

  3.   

    是有的UserVo userVo = null;、放在外面好点。
      

  4.   

    没有什么差别.
    测试,test1,test2两个方法: import java.util.ArrayList;
    import java.util.Iterator;public class Main{
        public static void main(String[] args) {
            
        }
        public void test1(ArrayList<String> list){
            String str ;
            Iterator<String> iterator = list.iterator();
            while(iterator.hasNext()){
                str = iterator.next();
            }
        }
        public void test2(ArrayList<String> list){
            Iterator<String> iterator = list.iterator();
            while(iterator.hasNext()){
                String str = iterator.next();
            }
        }
    }反编译: public void test1(java.util.ArrayList);
      Code:
       Stack=1, Locals=4, Args_size=2
       0: aload_1
       1: invokevirtual #2; //Method java/util/ArrayList.iterator:()Ljava/util/Iterator;
       4: astore_3
       5: aload_3
       6: invokeinterface #3,  1; //InterfaceMethod java/util/Iterator.hasNext:()Z
       11: ifeq 27
       14: aload_3
       15: invokeinterface #4,  1; //InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
       20: checkcast #5; //class java/lang/String
       23: astore_2
       24: goto 5
       27: return
      LineNumberTable: 
       line 10: 0
       line 11: 5
       line 12: 14
       line 14: 27
      Signature: length = 0x2
       00 11 public void test2(java.util.ArrayList);
      Code:
       Stack=1, Locals=4, Args_size=2
       0: aload_1
       1: invokevirtual #2; //Method java/util/ArrayList.iterator:()Ljava/util/Iterator;
       4: astore_2
       5: aload_2
       6: invokeinterface #3,  1; //InterfaceMethod java/util/Iterator.hasNext:()Z
       11: ifeq 27
       14: aload_2
       15: invokeinterface #4,  1; //InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
       20: checkcast #5; //class java/lang/String
       23: astore_3
       24: goto 5
       27: return
      LineNumberTable: 
       line 16: 0
       line 17: 5
       line 18: 14
       line 19: 24
       line 20: 27
      Signature: length = 0x2
       00 11 
    出了局部变量的编号不同,没看出什么差别.
    再用jad对class文件进行反编译: // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
    // Jad home page: http://www.kpdus.com/jad.html
    // Decompiler options: packimports(3) 
    // Source File Name:   Main.javaimport java.util.ArrayList;
    import java.util.Iterator;public class Main
    {    public Main()
        {
        }    public static void main(String args[])
        {
        }    public void test1(ArrayList arraylist)
        {
            String s;
            for(Iterator iterator = arraylist.iterator(); iterator.hasNext();)
                s = (String)iterator.next();    }    public void test2(ArrayList arraylist)
        {
            String s;
            for(Iterator iterator = arraylist.iterator(); iterator.hasNext();)
                s = (String)iterator.next();    }
    }
    可以看出两个方法一样了.最后,你可以让两种方式都跑上几万次,测试花费的时间.
      

  5.   

    public class Test{
        public static void main(String [] args) {
        
         long t1 = System.currentTimeMillis();
         int a = 0;
         for(int i = 0; i < 50000000; i++) {
         a = 5;
         }
         long t2 = System.currentTimeMillis();
         System.out.println(t2 - t1);
        
         long t3 = System.currentTimeMillis();
            for(int j = 0; j < 50000000; j++) {
         int b = 5;
         }
         long t4 = System.currentTimeMillis();
         System.out.println(t4 - t3);
        } 
    }怎么输出结果是
    235
    109
    反而下面的效率要高些。。
      

  6.   

    是的,我这是吹毛求疵,栈空间的消耗和指针移动是微不足道的
    但我就是想知道这样优化的必要性
    会不会有浪费看了zangXT的反编译有点费解,反编译后居然一样了
    java编译是经过优化的,优化成一样了,是不是说明怎么写都一样,编译会统一到一样呢
      

  7.   

    第二种 只要while的()里头是true就会分配一块内存。。