KuangAnGuo
AnGuoK
采纳率20%
2018-01-21 15:27 阅读 3.1k

关于for循环遍历,下面的两种的方式有什么不同?

5

1、// adapter.getCheckBox()是获得从adapter中返回的Arrayliset数组;dao.save()是保存获得数据
for (int i=0;i<adapter.getCheckBox().size();i++){
dao = new ContactsDao(getApplicationContext());
ContactsBean c=adapter.getCheckBox().get(i);
dao.save(c);
}

2、 for (ContactsBean c:adapter.getCheckBox()) {
                dao = new ContactsDao(getApplicationContext());
                dao.save(c);
            }




3、结果
第一种遍历方式得到一个无限循环的结果;第二种就不会出现无限循环的情况,请解释一下为甚会出现这中请况?顺便说说两种方式的应用场景有什么不同?
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

15条回答 默认 最新

  • caozhy 从今以后生命中的每一秒都属于我爱的人 2018-01-21 15:42
     大多数情况下,两者是一样的,但是有一个例外,就是i<adapter.getCheckBox().size()是一个变量。比如说,你循环里添加或者删除集合的数据。
    如果两个程序是等价的,那么怎么写是个人偏好问题,但是下面的更简洁。如果两个程序因为上面说的原因而不等价,那么就要看你的算法。
    
    点赞 2 评论 复制链接分享
  • qq_37111237 潇潇666 2018-01-22 01:31

    两者都是一样的,视情况而定,比如有时候你会用到遍历时候的指针,如: if(i == 3) { ... },这时候用上面那种好点, 一般来说没有其他条件只要遍历的话,推荐使用下面那种,代码简洁明了。 不过我自己一般这种情况都不使用匿名的变量,感觉占资源

    点赞 2 评论 复制链接分享
  • syrobot Howard_in_NASA 2018-01-21 17:23

    ContactsBean c=adapter.getCheckBox().get(i); i在累加

    点赞 1 评论 复制链接分享
  • flonny 精锐小菜鸡 2018-01-22 01:46

    1、无线循环一定是i<adapter.getCheckBox().size()这个条件一直满足,也有博友说了这可能是个变量,具体还是需要你自己检查
    2、我说一下两个循环的不同应用场景吧,既然你循环的是arrayList,那么底层实现其实就是一个数组,而数组的遍历肯定是直接用下标获取速度快,
    用foreach的方式循环是用iterator的next的方法遍历,而这个next方法最终也是通过下标获取数组中的值,并且附加了验证方法,所以没有直接用下标获取速度来的快

    点赞 1 评论 复制链接分享
  • z3jjlzt 我的学长是王欣 2018-01-22 02:07

    for (int i=0;i<adapter.getCheckBox().size();i++){} 这种方法是不被推荐使用的,int size = adapter.getCheckBox().size();for (int i=0;i<size;i++){}

    点赞 1 评论 复制链接分享
  • u012475698 Ax潜行 2018-01-22 02:13

    在一般情况下,两种方式没有区别。除非集合长度在代码运行时有变化或者i的值收到其他因素影响改变,其余情况下两个的运行情况是一样的。
    建议你对第一种debug一下看一下i是不是按照正常按照循环递增和adapter.getCheckBox().size()的值有没有变化。
    实在不行就控制台打印一下,出现无限循环就得查看一下循环终止的条件是不是能满足

    点赞 1 评论 复制链接分享
  • sinat_34344123 星尘的一个朋友 2018-01-22 02:14
     /*
             * 首先讲一下您的这个 无限循环的问题
             * 如果你想在遍历循环的过程中,对当前集合做增删操作的话,需要使用一个安全的集合
             * 而不是一个简单的ArrayList
             * 推荐使用:
             * CopyOnWriteArrayList
             *
             * 在讲一下你的另一个问题
             *
             * 两种都是循环遍历,他们的底层都是通过迭代器实现的.
             * 第二种 我们更习惯成为增强for循环,是JDK 1.5之后的产物.使我们的循环变得更加方便,更加容易.
             * 但在互联网告诉发展下,更是推动了我们更多的需要产生,在JDK 1.8 中,更是有了λ表达式的加入,使循环变得更加容易使用和理解
             * 例如您的一段循环,在JDK 1.8 中的体现为
             */
            adapter.getCheckBox().foreach(c -> {
                dao = new ContactsDao(getApplicationContext());
                dao.save(c);
            });
    
    
    点赞 1 评论 复制链接分享
  • weixin_37830918 weixin_37830918 2018-01-22 02:42

    最好不要是用匿名资源

    点赞 1 评论 复制链接分享
  • dong273844632 dong_bobo 2018-01-22 06:25

    尽量不要在for()里面有方法调用之类的操作,你应该定义一个变量指向该方法调用,如:
    int size=adapter.getCheckBox().size();
    for(int i=0;i for循环会自动去调用你的表达式,可能你的adapter.getCheckBox().size()一直在变,而且这样对于性能也不好
    for (ContactsBean c:adapter.getCheckBox()) {
    也应改完
    List list = adapter.getCheckBox();
    for (ContactsBean c:list) {
    不是所有的操作写到一行,或者越简洁越好,你应该去考虑你的代码的效率性能,常量值,无所谓,引用值变量是可以改变的

    点赞 1 评论 复制链接分享
  • xu347951461 xu347951461 2018-01-22 02:07

    第二种比较简洁,推荐第第二种

    点赞 评论 复制链接分享
  • qq_34756209 Jian_Shen_Zero 2018-01-22 02:25

    楼主你第一个代码无限循环,估计是因为你循环里的dao = new ContactsDao(getApplicationContext());这句代码一直到添加adapter.getCheckBox().size();的值,所以会无限叠加,而第二个代码不无限叠加是因为adapter.getCheckBox().size();获取的是初始getCheckBox().size()的值不会随着后续的添加而增加,所以不会出现循环,使用foreach遍历的时候是不能够对对象进行增删的操作,会出问题。

    点赞 评论 复制链接分享
  • xiadongqi xiadongqi 2018-01-22 03:27

    第二种是增强for循环,用这种好

    点赞 评论 复制链接分享
  • mizzle_up 铮小米 2018-01-22 03:44

    这两种循环的内部逻辑是很相似的,一般情况下第二种更适用于获取内部对象。

    点赞 评论 复制链接分享
  • m0_37852904 阡路陌人 2018-01-22 05:48

    dao = new ContactsDao(getApplicationContext()); 将这个放到循环外面。放在里面就是每次循环就重新new一遍了,就陷入了死循环。

    点赞 评论 复制链接分享
  • mixzck mixzck 2018-01-25 01:50

    大多数情况来看,第一种和第二种for循环的区别不大,而且第二种的运算速度和简易程度要好点,所以如何不是特殊情况的话,通常更偏向使用第二种for循环

    点赞 评论 复制链接分享

相关推荐