有两段代码,分别是:
1.public void a(){
  File f = null;//这里相当于定义全局变量吧
  for (int=0;i<1000000;i++){
    f = new File("这里是文件路径");
    ....//其它操作,比如输出文件到磁盘等等
  }
}2.public void a(){
    for (int=0;i<1000000;i++){
   File  f = new File("这里是文件路径");
    ....//其它操作,比如输出文件到磁盘等等
  }
}这两段代码很相似,细心的你应该看出来区别了吧,之前我都是用第二种写法,后来感觉好像有点问题,第二种每次循环时,
都创建一个新的文件对象,可能会占用太多内存空间,而第一种虽然也new 出新对象,但都是指向f的引用,这样是不是效率或占用内存更小点呢?
后来又想想,感觉也不对,第二种也是只指向一个f的引用啊,两种应该是没区别的才对啊.......
以前常听老师说尽量少用全局变量的原则之类的,如此看来应该是第一种更合理吧?请各位前辈表达下看法吧.

解决方案 »

  1.   

    第一种变量f的生命周期是整个方法的生命周期,其占用的内存空间将会在方法执行完后才会释放,而第二种变量f的生命周期是一次for循环的生命周期,当循环执行完后其占用的内存空间就会释放,只是第二种每次循环它都要申请一个变量应该在效率上有点缺陷。
      

  2.   

    java 没有全局变量,再说你这两种形式是一样的,都是局部变量。这里不存在你担心的空间问题,首先要明确File f只是一个引用(如果学过c、c++的话可以把它当做指针)。看整个方法的执行周期,任何时候始终只有1个引用的空间被分配;而对象个数是跟new的次数相关的,两种情况是一样的,因为new的次数是跟循环次数相关的,所以创建的对象个数两个写法是没有区别的。
      

  3.   


    同意,都是相同数量的new创建对象,两个方法应该效果差不多
      

  4.   

    区别肯定是有的,
    堆内存中没什么差别,但是栈中的区别却很明显
    堆中你new了多少次就有多少哥file对象
    而栈中,用实例变量,只分配一个栈空间
    而用局部变量就会分配1000000次!
    粗解
      

  5.   

    个人觉得第二种可取,因为每次创建后,随着循环的结束,创建的对象就被垃圾回收器收回了,
    然后再创建新的对象,而且,以:
    public void a(){
      File f = null;//这里相当于定义全局变量吧
      for (int=0;i<1000000;i++){
        f = new File("这里是文件路径");
        ....//其它操作,比如输出文件到磁盘等等
      }
    }
    这种方式创建的 对象f 不会随着循环结束而别回收,但是循环结束后你的 f 已经没有用了,就可以被收回了,
    不应该再占用内存空间了,所以这时候如果你在循环内定义的话,对象f 就会随着循环的结束而释放内存
    资源。希望可以给楼主帮助
      

  6.   

    Java没有全局变量。两个情况的变量都是局部变量,只是一个局部变量的生命周期整个函数有效,第二个函数内有效。
    但是,第二个堆区的对象能否立刻回收取决于GC是否启动。
    这两种方式差不多,第二种占用空间,空间复杂度高。还是第一种适用的情况更多一些。
      

  7.   

    第一种、更合理,内存及cpu的资源占用都比较少
    1、第二种、每个循环都要创建变量而第一种只要创建一个变量就OK了,new新对象是一样的!明显第一种优
    2、第二种只要还在循环中就存在大于一个f变量在,gc并不是每次循环都调用的回收资源的,而第一种一直只有一个f变量存在的,只是他更早点创建而已!