求解释,for循环定义变量问题

WorkLee 2012-05-25 11:20:25
求解释for循环的问题

举例1

String str = "";
for(int i=0;i < 5;i++){
str = i+"";
//下面处理str其他操作
}


举例2

for(int i=0;i < 5;i++){
String str = i+"";
//下面处理str其他操作
}


这两种定义方式,哪个会对系统开销大,哪个会快些,建议用哪个
原因是什么
我问过不少人,对各种说法不一,求真相

当然这是个例子,真实的循环不止是<5的简单循环
...全文
400 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhusbJava 2012-05-27
  • 打赏
  • 举报
回复
//看看吧
zhusbJava 2012-05-27
  • 打赏
  • 举报
回复

//真的么
hfmbook 2012-05-27
  • 打赏
  • 举报
回复
如果你要算开销的话,我建议代码最好这样写

String str = null ;
for(int i=0;i < 5;i++){
str = String.valueOf( i ) ;
//下面处理str其他操作 操作完之后 将 str清空
//这样可以提前销毁该对象,不需要系统一直保留该对象。
str = null ;

}
WorkLee 2012-05-25
  • 打赏
  • 举报
回复
1楼大神,请看清楚了再说,无语
huage 2012-05-25
  • 打赏
  • 举报
回复
开销的话应该是下面个局部变量更好吧,这么问的时候首先要了解局部和全局的诧异撒
小米xylitol 2012-05-25
  • 打赏
  • 举报
回复
楼上正解,楼下补充
sdojqy1122 2012-05-25
  • 打赏
  • 举报
回复
不相伯仲吧。自己测试呗。

package card;

public class Test {
public static void main(String[] args) {
System.out.println(timeCost(1));
System.out.println(timeCost(2));
}

public static long timeCost(int i) {
long startTime = System.currentTimeMillis();
if (i == 1) {
test1();
}else {
test2();
}
long endTime = System.currentTimeMillis();

return endTime - startTime;
}

public static void test1() {
String str = null;
for (int i = 0; i < 20000000; i+=2){
str = i + "";
}
}

public static void test2() {
for (int i = 1; i < 20000000; i+=2) {
String str = i + "";
}
}
}

A_545571406 2012-05-25
  • 打赏
  • 举报
回复
楼主的主要问题是这个:变量str是在for循环体里面定义还是在for循环体外部定义。就性能而言第一种较好(但是好多少,不好说,一般可以忽略,如果你真的首要考虑性能的话还是建议用第一个);如果str只在循环体内有效的话,同时首要考虑程序的规范性的话,其次才考虑性能的话建议第二个。
原因(摘自http://www.iteye.com/problems/74037)如下:
放在循环内部定义,确实会多次申请栈帧的内存空间(java中一个线程对应一个Java栈,每次方法调用会向栈中压入一个新帧,帧中存储着参数、局部变量、中间运算结果等等数据,方法调用结束后当前的帧就被弹出了,为什么会多占用栈空间内,原因很简单,每次循环都要重复定义局部变量,而如果放在循环体外,每次只要移动引用指向的堆内存地址即可,不必重新申请内存空间了。
qiongta 2012-05-25
  • 打赏
  • 举报
回复
建议使用StringBuffer来使用,这种方法只会返回当前字符串
zqfddqr 2012-05-25
  • 打赏
  • 举报
回复
应该都一样吧 个人 建议用下面的 最小定义范围.
sffx123 2012-05-25
  • 打赏
  • 举报
回复
先不谈开销问题,这两段代码实现的功能都不同怎么比较?第一个是把数字逐步累积拼接成一个字符串,再处理,第二个是每个数字作为一个字符串来处理。实现功能不同怎么比较?另外如果要考虑开销跟效率问题,不能使用String,for循环里面每次都会创建出来一个新的String对象,使用StringBuffer吧,直接append(内容),不生成新对象。
朗晴 2012-05-25
  • 打赏
  • 举报
回复
首先是一个局部变量和一个全局变量比较开销问题,建议用StringBuffer做这个第一题目,相对代码要好些。

两种语句功能不同,开销用测JAVA时长的语句一测便知:

long startTime=System.currentTimeMillis();//开始
long endTime=System.currentTimeMillis();//结束
FFF9527 2012-05-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

试了下,50000以为,下面比上面快2~5倍,

再大的数之后,快大概5~6分之1~~~

猜测:int + ""总是生成新的对象,
第一个会将生成的新对象赋值给str,而前一个生成的对象,没有明确抛弃,垃圾回收的时候也比较的耗时。
第二个局部对象将不做再赋值操作,切明确该块结束时,将进行垃圾回收,明确回收的对象,耗时较低。

PS:在JAVA中,明确不再需要……
[/Quote]

好吧,我错了,速度都差不多一样。


long t1 = System.nanoTime();
for(int i=0;i < 50000;i++){
String str01 = i+"";
//下面处理str其他操作
}
long t2 = System.nanoTime();
System.out.println(t2 - t1);

long t3 = System.nanoTime();
String str = "";
for(int i=0;i < 50000;i++){
str = i+"";
//下面处理str其他操作
}
long t4 = System.nanoTime();
System.out.println(t4 - t3);

总是前面的程序比后面的程序耗时..........
FFF9527 2012-05-25
  • 打赏
  • 举报
回复
试了下,50000以为,下面比上面快2~5倍,

再大的数之后,快大概5~6分之1~~~

猜测:int + ""总是生成新的对象,
第一个会将生成的新对象赋值给str,而前一个生成的对象,没有明确抛弃,垃圾回收的时候也比较的耗时。
第二个局部对象将不做再赋值操作,切明确该块结束时,将进行垃圾回收,明确回收的对象,耗时较低。

PS:在JAVA中,明确不再需要的值,赋值为null,速度的提升是比较明显的。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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