A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

留鹤村

初级黑马

  • 黑马币:0

  • 帖子:5

  • 精华:0

© 留鹤村 初级黑马   /  2012-7-5 12:01  /  2338 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 留鹤村 于 2012-7-5 16:11 编辑

请问(1)
int i;
for()
{
     i=Math.random();
}
与(2)
for()
{
     int i=Math.random();
}
性能上有区别吗?或者还有其它不同?
如果是(2)的情况 每次循环都要声明变量i ,性能上有多少差距?

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

9 个回复

倒序浏览
1:
int i;
for()
{
     i=Math.random();
}

2:
for()
{
     int i=Math.random();
}
这里是没有什么区别,因为都是局部函数引用。
但是在1中,int i是成员变量。可以被其他函数或者方法引用。
在2中,int i是局部变量,当被引用完会被释放,不可以被其他函数调用。

回复 使用道具 举报
两个变量的作用域不同。从变量定义的位置开始,到变量所在的那对大括号结束。
回复 使用道具 举报
1里面的i是全局变量,2里面的i是局部变量。作用范围不一样。
回复 使用道具 举报
用法上没区别,在某些方面有点区别,在你用
int i;
for()
{
     i=Math.random();
}
这个的时候i的生命周期长,并且能在for代码块外调用,一般会用到这个,因为你赋值给i就要用到i,比如返回i...
回复 使用道具 举报
int i;//这个i可以在全局中使用
for()
{
     i=Math.random();
}

for()
{
     int i=Math.random();//这里定义的i变量,当for循环结束后便失去作用,会被垃圾回收器回收
}
I的作用域不同,
回复 使用道具 举报
如果是2 的情况,那么每次循环都要声明变量i,这样性能上有多少差距?
回复 使用道具 举报
第一种方法:int i  在for循环外,那么在栈内存中值创建了一个int类型的变量 i,for循环内部只是不断地对其赋值
第二种方法:int i  在for循环内部,每次进行for循环,栈内存中都要创建一个int类型的变量 i,并且每循环一次就要再释放一次这个变量,然后再创建,再释放
性能上来说,第一种比第二种好。

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1 赞一个!

查看全部评分

回复 使用道具 举报
高原 发表于 2012-7-5 14:00
第一种方法:int i  在for循环外,那么在栈内存中值创建了一个int类型的变量 i,for循环内部只是不断地对其 ...

谢谢 明白了
回复 使用道具 举报
高原 发表于 2012-7-5 14:00
第一种方法:int i  在for循环外,那么在栈内存中值创建了一个int类型的变量 i,for循环内部只是不断地对其 ...

回答不错,补充下:

第一种方法:int i  在for循环外,作用域在全局
第二种方法:int i  在for循环内部,作用域在for循环内

性能上来说,第一种比第二种好。这段程序确实是这样的,但在实际开发中,在for循环外new出变量不一定比在for循环内new出变量性能好。

理由如下:
1,实际开发中,new出的对象一般都较复杂,很占内存,要提高性能,必须尽可能的避免new出对象
一般都在for循环内加入条件,限制new新对象,这时,第一种方法一定会new出新对象,而第二种方法不一定
会new出对象。
2,从安全上考虑,第一种方法new出对象的作用域范围比第二种大的多,安全漏洞也大,有些重要的信息还是定义在for循环内部较好
3,从JVM的垃圾处理机制上考虑,第一种方法new出对象的生命周期较长,当对象不被这个for循环使用时,还有可能被其他程序使用,导致对象长期占有内存,无法释放资源。

综上所述,实际开发中,要根据需要合理采用代码,一般情况下,使用第二种方法性能较好。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马