变量放在循环体内还是外?

鱿鱼x 2014-09-05 11:52:02

public static void main(String[] args) {

for (int i = 0; i < 10; i++) {
String name = "stephen "+i;
System.out.println(name);
}

String name = null;
for (int i = 0; i < 10; i++) {
name = "stephen "+i;
System.out.println(name);
}
}

可以从性能、规范或安全上讲那样更好
...全文
723 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
nullnullcan 2014-09-09
  • 打赏
  • 举报
回复
建议使用第二种 将String换成StringBuider或者StringBuffer,性能更好。
逍遥jc 2014-09-09
  • 打赏
  • 举报
回复
一般情况下,我不喜欢在循环中创建变量,而是会选择赋值。所以我喜欢用第二种。
有明丶 2014-09-08
  • 打赏
  • 举报
回复
特别推荐第一种! 其实两种情况都会去申请新的内存,这是JAVA机制造就的。 而缩小变量的作用域,就意味着: 1. 变量能更早的被回收 2. 减少错误的概率 所谓推荐第二种的,完全是不了解内存分配机制吧
rumlee 2014-09-08
  • 打赏
  • 举报
回复
推荐第一种,建议尽可能缩小变量的作用域。 不过在你这个问题上面,两种方法并没有明显的优劣,只是编程习惯问题。
??435 2014-09-07
  • 打赏
  • 举报
回复
从性能的角度讲两者是一样的,都是每次for循环一次内存地址保存字符串,这样效率较差 ,当for循环的循环次数较大时就能明显表现出来建议用StringBuffer来连接字符串效率很高
skgary 2014-09-07
  • 打赏
  • 举报
回复
其实,无论编译器有没有优化过,这两种写法上的区别对于性能的影响可以忽略不计。 为何说忽略不计,我可以简单的问一下这边所有楼上楼下的,自己在实际的工作中,是否碰到过因为这两种写法的区别导致系统出现问题?
一大三千 2014-09-06
  • 打赏
  • 举报
回复
引用 20 楼 HinanaiTenshi 的回复:
[quote=引用 18 楼 stonefeng 的回复:] [quote=引用 17 楼 HinanaiTenshi 的回复:] [quote=引用 10 楼 stonefeng 的回复:] 兄弟们,别争论了,这事我经历过。结论是两种性能一样。 因为java编译器会将第第一种优化成第二种,所以性能一样。 但是写第一种会更直观和更简单,易于维护。 所以大家写的时候,尽管按照第一种写吧,也不用担心性能问题。担心性能的,都是老旧的不知道几百年前的编译器了!
还是有区别的,第一种会创建一个句柄,在循环结束之后依然存在,说白了就是有语法上的差别。 [/quote] 会有个变量存在,但是不会指向任何对象,也就是说变量会被清空的。[/quote] 怎么可能会被清空。 上面是我看错了,是第二种会多一个string的句柄,就算只看语法也知道有区别啊,第二种方式里的name变量在循环结束后是可以继续使用的,并且值就是运算完之后的值。[/quote]在main方法结束后,存放在栈里的string会被回收吧
  • 打赏
  • 举报
回复
学习了,受益匪浅
卖水果的net 2014-09-06
  • 打赏
  • 举报
回复
只用过第二种写法,也不反对使用第一种。
anakin_feng 2014-09-05
  • 打赏
  • 举报
回复
引用 4 楼 a12939026 的回复:
[quote=引用 3 楼 Molly_1994 的回复:] 个人认为第二种吧,第一种每次都要重新分配地址,第二中分配一次,后面只是该值
每一种都是重新分配地址。 性能和安全上完全一样。 规范上没有针对这个问题的普适规范。[/quote]这样啊,又学到了
a12939026 2014-09-05
  • 打赏
  • 举报
回复
引用 3 楼 Molly_1994 的回复:
个人认为第二种吧,第一种每次都要重新分配地址,第二中分配一次,后面只是该值
每一种都是重新分配地址。 性能和安全上完全一样。 规范上没有针对这个问题的普适规范。
anakin_feng 2014-09-05
  • 打赏
  • 举报
回复
个人认为第二种吧,第一种每次都要重新分配地址,第二中分配一次,后面只是该值
**:天下第一 2014-09-05
  • 打赏
  • 举报
回复
我一般用第2种。。。
whos2002110 2014-09-05
  • 打赏
  • 举报
回复
理论上是下面那样好些, 但这样些怪怪的不如第一种直观。 建议第一种写法
疯癫行者 2014-09-05
  • 打赏
  • 举报
回复
引用 20 楼 HinanaiTenshi 的回复:
[quote=引用 18 楼 stonefeng 的回复:] [quote=引用 17 楼 HinanaiTenshi 的回复:] [quote=引用 10 楼 stonefeng 的回复:] 兄弟们,别争论了,这事我经历过。结论是两种性能一样。 因为java编译器会将第第一种优化成第二种,所以性能一样。 但是写第一种会更直观和更简单,易于维护。 所以大家写的时候,尽管按照第一种写吧,也不用担心性能问题。担心性能的,都是老旧的不知道几百年前的编译器了!
还是有区别的,第一种会创建一个句柄,在循环结束之后依然存在,说白了就是有语法上的差别。 [/quote] 会有个变量存在,但是不会指向任何对象,也就是说变量会被清空的。[/quote] 怎么可能会被清空。 上面是我看错了,是第二种会多一个string的句柄,就算只看语法也知道有区别啊,第二种方式里的name变量在循环结束后是可以继续使用的,并且值就是运算完之后的值。[/quote] 嗯……这个清空是猜测的,暂时没有根据,暂时收回,回头有证据再回复哈。
HinanaiTenshi 2014-09-05
  • 打赏
  • 举报
回复
引用 18 楼 stonefeng 的回复:
[quote=引用 17 楼 HinanaiTenshi 的回复:] [quote=引用 10 楼 stonefeng 的回复:] 兄弟们,别争论了,这事我经历过。结论是两种性能一样。 因为java编译器会将第第一种优化成第二种,所以性能一样。 但是写第一种会更直观和更简单,易于维护。 所以大家写的时候,尽管按照第一种写吧,也不用担心性能问题。担心性能的,都是老旧的不知道几百年前的编译器了!
还是有区别的,第一种会创建一个句柄,在循环结束之后依然存在,说白了就是有语法上的差别。 [/quote] 会有个变量存在,但是不会指向任何对象,也就是说变量会被清空的。[/quote] 怎么可能会被清空。 上面是我看错了,是第二种会多一个string的句柄,就算只看语法也知道有区别啊,第二种方式里的name变量在循环结束后是可以继续使用的,并且值就是运算完之后的值。
疯癫行者 2014-09-05
  • 打赏
  • 举报
回复
也就是说用空间换时间。
疯癫行者 2014-09-05
  • 打赏
  • 举报
回复
引用 17 楼 HinanaiTenshi 的回复:
[quote=引用 10 楼 stonefeng 的回复:] 兄弟们,别争论了,这事我经历过。结论是两种性能一样。 因为java编译器会将第第一种优化成第二种,所以性能一样。 但是写第一种会更直观和更简单,易于维护。 所以大家写的时候,尽管按照第一种写吧,也不用担心性能问题。担心性能的,都是老旧的不知道几百年前的编译器了!
还是有区别的,第一种会创建一个句柄,在循环结束之后依然存在,说白了就是有语法上的差别。 [/quote] 会有个变量存在,但是不会指向任何对象,也就是说变量会被清空的。
HinanaiTenshi 2014-09-05
  • 打赏
  • 举报
回复
引用 10 楼 stonefeng 的回复:
兄弟们,别争论了,这事我经历过。结论是两种性能一样。 因为java编译器会将第第一种优化成第二种,所以性能一样。 但是写第一种会更直观和更简单,易于维护。 所以大家写的时候,尽管按照第一种写吧,也不用担心性能问题。担心性能的,都是老旧的不知道几百年前的编译器了!
还是有区别的,第一种会创建一个句柄,在循环结束之后依然存在,说白了就是有语法上的差别。
tuzuxiao 2014-09-05
  • 打赏
  • 举报
回复
一般而言尽量缩小变量的作用范围,so,,,,,,
加载更多回复(10)

62,616

社区成员

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

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