Java中对象声明时机的疑问

me阿木 2013-03-14 11:39:24
对于Java中对象在什么时候声明存在着一些疑问。
比如下面的两个方法:
方法一:

public void test(){
double tmp = 0;
for(int i=0; i<10000; i++){
tmp = Math.random();
System.out.println(tmp);
}
}

方法二:

public void test(){
for(int i=0; i<10000; i++){
double tmp = Math.random();
System.out.println(tmp);
}
}


这两个方法实现的功能是一样的。但是变量tmp声明的时机和次数却不一样。我经常使用方法一,以为可以减少声明变量的次数。看了一些资料后,了解到方法一占用内存的时间却比较长。有谁能够详细解释一下这两个方法的区别以及优劣处。

在这两个方法中变量都是基础类型。如果变量改成引用类型后又有什么区别。
...全文
100 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
龙四 2013-03-14
  • 打赏
  • 举报
回复
引用 4 楼 ticmy 的回复:
并没有什么差别,java调用一个方法前,所有局部变量的内存都已经分配好了,即使写在for里面那个变量也会多次重用,并不存在多次开辟内存空间这种其它某些语言才干的事儿
唯一的差别就是作用域不一样,第一种在for结束了之后还能访问到
龙四 2013-03-14
  • 打赏
  • 举报
回复
并没有什么差别,java调用一个方法前,所有局部变量的内存都已经分配好了,即使写在for里面那个变量也会多次重用,并不存在多次开辟内存空间这种其它某些语言才干的事儿
shine333 2013-03-14
  • 打赏
  • 举报
回复
除非是对性能要求极端极端极端极端...极端严格的程序,永远建议使用第二种。当然,如果是对性能很严苛的程序,一般(如果不是全部的话)不会用Java。 上面两种差异,带来的性能上的差别,对于绝大部分应用,完全可以忽略不计。但是,前面一种写法,可能造成的Bug,确实难以承受的。 查看Effective Java: Minimize the Scope of Local Variables
「已注销」 2013-03-14
  • 打赏
  • 举报
回复
如果换成引用类型,第一种方法明显要好,因为JVM回收垃圾机制是检查堆中数据结构是否在栈中中有引用指向它,如果没有,就回收。第一种方法明显利用JVM管理内存。
「已注销」 2013-03-14
  • 打赏
  • 举报
回复
第一种方法,double temp 会在执行for()时一直存在于内存中,好处可以减少声明变量temp的次数; 第二种方法,double temp只有在执行for()时才得到JVM内存分配,好处是temp变量不用一直占据内存的,缺点是,频繁的申请内存影响执行速度。

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧