锁定老帖子 主题:代码难道不是这么写的?
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-28
J-catTeam 写道 vvggsky 写道 评审的说的没错,重复多建了许多对象
不过也没太大区别 没有重复创建,只是重复申明,不存在多余内存消耗的问题。 ............................ |
|
返回顶楼 | |
发表时间:2010-07-28
最后修改:2010-07-28
diferent 写道 但是a还没有过期,所以即使GC在这段时间内工作了,这个对象也不会被回收. 大概就是如此,也不算是问题,除非极特殊,这个A对象是否回收对系统有相当大的影响. 所以评审这种代码是很无聊的. 评审的时候找出一代码潜在问题, 重新组织代码的结构远比要纠结这种问题有意义的多 8) 这说法明显有问题 a 拥有一个引用, arr[i]拥有一个引用,如果a 和arr[i]的引用相同,那么对象上的计数器会被写成2,除非a和arr[i]的引用一起被null,否则该对象就不会被回收。 在这个例子中,显然arr的生命周期比a长得多,可以GC可以根本不考虑a |
|
返回顶楼 | |
发表时间:2010-07-28
现在使用更加面向对象的For循环写
例如 for( A a : arr ){ System.out.println(s); } 这种方式是JDK1.5以后推出的, 在执行效率上也是最高的。 要是有兴趣可以来一个百万级的比较就可以发现这个性能有着明显的提升。 |
|
返回顶楼 | |
发表时间:2010-07-28
最后修改:2010-07-28
Rambing 写道 现在使用更加面向对象的For循环写
例如 for( A a : arr ){ System.out.println(s); } 这种方式是JDK1.5以后推出的, 在执行效率上也是最高的。 要是有兴趣可以来一个百万级的比较就可以发现这个性能有着明显的提升。 学C#的语法sugar而已,说性能就有点扯了...要真能和性能扯点关系,for-each loop会保证集合界限只计算一次,而蹩脚程序员常常会在一个for循环里重复计算这个。 |
|
返回顶楼 | |
发表时间:2010-07-28
XTU_xiaoxin 写道 今天代码评审时,
...... 骂我内容:说我会不会编程,把变量写在for循环里面,说如果遍历多次的话会占用大量的堆内存。 ...... 怎么也不会占用堆内存吧 变量是放在栈里的 |
|
返回顶楼 | |
发表时间:2010-07-28
Rambing 写道 现在使用更加面向对象的For循环写
例如 for( A a : arr ){ System.out.println(s); } 现在这么写才是正解 |
|
返回顶楼 | |
发表时间:2010-07-28
我有点迷惑,比如:
String a = {"a","b","c"}; for(int i=0;i<a.length;i++){ System.out.println(a[i]); } 以上这段代码是否要改成: String a = {"a","b","c"}; int len = a.length; for(int i=0;i<len;i++){ System.out.println(a[i]); } 这样改的意义何在?a.length只是一个属性而已,在内存里应该已经分配了指定的空间来装载,就算你每次调用a.length也只是掉用同一个内存区域而已,为何会出现重复计算?高手请指教 |
|
返回顶楼 | |
发表时间:2010-07-28
我想知道
for(int i = 0;i<arr.len;i++) { A a = arr[i]; System.out.println(s); } 这个a是干嘛用的 |
|
返回顶楼 | |
发表时间:2010-07-28
maodiesky 写道 我若是评审会叫你这么改
int arrLen = arr.len; for(int i = 0;i<arrLen ;i++) { A a = arr[i]; System.out.println(s); } 看情况吧,如果 for 里面要对数组进行添加删除,又或者考虑线程安全性的话,还是保持原样的好。 |
|
返回顶楼 | |
发表时间:2010-07-28
估计评审装的是 findbugs这个插件
|
|
返回顶楼 | |