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

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、结果
第一种遍历方式得到一个无限循环的结果;第二种就不会出现无限循环的情况,请解释一下为甚会出现这中请况?顺便说说两种方式的应用场景有什么不同?
 大多数情况下,两者是一样的,但是有一个例外,就是i<adapter.getCheckBox().size()是一个变量。比如说,你循环里添加或者删除集合的数据。
如果两个程序是等价的,那么怎么写是个人偏好问题,但是下面的更简洁。如果两个程序因为上面说的原因而不等价,那么就要看你的算法。

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

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

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

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

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

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

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

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

最好不要是用匿名资源

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

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

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

尽量不要在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) {
不是所有的操作写到一行,或者越简洁越好,你应该去考虑你的代码的效率性能,常量值,无所谓,引用值变量是可以改变的

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