黑马程序员技术交流社区

标题: 关于for循环 内部变量 [打印本页]

作者: 留鹤村    时间: 2012-7-5 12:01
标题: 关于for循环 内部变量
本帖最后由 留鹤村 于 2012-7-5 16:11 编辑

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

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


作者: 杨锦    时间: 2012-7-5 12:21
两个变量的作用域不同。从变量定义的位置开始,到变量所在的那对大括号结束。
作者: 陈世涛    时间: 2012-7-5 12:43
1里面的i是全局变量,2里面的i是局部变量。作用范围不一样。
作者: 常佳杰    时间: 2012-7-5 12:49
用法上没区别,在某些方面有点区别,在你用
int i;
for()
{
     i=Math.random();
}
这个的时候i的生命周期长,并且能在for代码块外调用,一般会用到这个,因为你赋值给i就要用到i,比如返回i...

作者: 刘勇军    时间: 2012-7-5 12:53
int i;//这个i可以在全局中使用
for()
{
     i=Math.random();
}

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

谢谢 明白了
作者: 徐炯    时间: 2012-7-6 00:00
高原 发表于 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循环使用时,还有可能被其他程序使用,导致对象长期占有内存,无法释放资源。

综上所述,实际开发中,要根据需要合理采用代码,一般情况下,使用第二种方法性能较好。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2