有两段代码,分别是:
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.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的引用啊,两种应该是没区别的才对啊.......
以前常听老师说尽量少用全局变量的原则之类的,如此看来应该是第一种更合理吧?请各位前辈表达下看法吧.
同意,都是相同数量的new创建对象,两个方法应该效果差不多
堆内存中没什么差别,但是栈中的区别却很明显
堆中你new了多少次就有多少哥file对象
而栈中,用实例变量,只分配一个栈空间
而用局部变量就会分配1000000次!
粗解
然后再创建新的对象,而且,以:
public void a(){
File f = null;//这里相当于定义全局变量吧
for (int=0;i<1000000;i++){
f = new File("这里是文件路径");
....//其它操作,比如输出文件到磁盘等等
}
}
这种方式创建的 对象f 不会随着循环结束而别回收,但是循环结束后你的 f 已经没有用了,就可以被收回了,
不应该再占用内存空间了,所以这时候如果你在循环内定义的话,对象f 就会随着循环的结束而释放内存
资源。希望可以给楼主帮助
但是,第二个堆区的对象能否立刻回收取决于GC是否启动。
这两种方式差不多,第二种占用空间,空间复杂度高。还是第一种适用的情况更多一些。
1、第二种、每个循环都要创建变量而第一种只要创建一个变量就OK了,new新对象是一样的!明显第一种优
2、第二种只要还在循环中就存在大于一个f变量在,gc并不是每次循环都调用的回收资源的,而第一种一直只有一个f变量存在的,只是他更早点创建而已!