由for循环引发的思考

最近看到一篇帖子 讨论for循环问题,for循环如下
arr是一个数组
一种是
for(int i = 0;i<arr.len;i++) {
A a = arr[i];
System.out.println(a);
}
另一种是
A a = null;
for(int i = 0;i<arr.len;i++) {
a = arr[i];
System.out.println(a);
}
对以上两种for循环的写法,讨论的很是激烈,看完讨论,觉得有位老兄说的比较准确,于是总结了下,有说错的地方,请指正, :D
第一种
这样做的优点是 缩小了引用A的作用范围. 但是每次把一个对象引用赋值给一个变量,占用栈内存较多,因为对象始终被变量引用,不一定被列为被回收对象
第二种
这样做的话 , 只声明了一次.但是在一些特殊情况下 比如所在的函数很长, 需要执行很多的时间. 那么,a变量将一直指向arr[arr.len-1],又恰好 arr[arr.len-1]在后来某操作而被弹出了arr数组.也就是从arr数组中被删除了.但是a还没有过期,所以即使GC在这段时间内工作了,这个对象也不会被回收. 这时前面循环的许多对象已经没有被变量引用,可以称之为废弃的,应该会优先被列为回收对象

由此 引发了我对for循环的比较:经过测试(百万)
对于for循环 我的建议是改成如下形式
A a = null;
for(int i = arr.len-1;i>=0;i--) {
a = arr[i];
System.out.println(a);
}
改成这种形式,效率是最高的,经过我的对三种for循环 正序,倒序,高级for比较效率从高到低为:倒序,正序,高级for;
并且对于嵌套for我也进行了测试
如果要进行嵌套for那最好把循环少的for放在最外面,这样减少cpu对for循环的切换,效率提升很明显,大家可以自己测试下,基本都是相反情况的一半。希望自己的测试能给大家带来一点编程的启示吧。哈哈 趁这会有空赶紧写下来
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值