第46条:for-each循环优先于传统的for循环

1.代码直观对比

传统for循环

for (Iterator<String> i = list.iterator();i.hasNext();) {
            doSomething(i.next());
        }

        for (int i = 0; i < list.size(); i++) {
            doSomething(list.get(i));
        }

for-each

for (String str : list) {
            doSomething(str);
        }

2.for-each的优点

比传统的for循环:html

  • 简洁性
  • 有效预防bug
  • 不用担忧性能损失

关于有效预防bug以及简洁性,请看如下代码:数组

// 不简洁,同时易误致使bug
        for (Iterator<String> i = list.iterator();i.hasNext();) {
            for (Iterator<String> j = list2.iterator();j.hasNext();) {
                doSomething(i.next(),j.next());
            }
        }

        // 简洁
        for (String s : list) {
            for (String s1 : list2) {
                doSomething(s,s1);
            }
        }

3.不能使用for-each状况

(1)过滤
若是须要遍历集合,并删除选定的元素,就须要使用显示的迭代器,以即可以调用它的remove方法。性能

// 正确作法
        for (Iterator<String> i = list.iterator();i.hasNext();) {
            i.next();  // 指向要删除的元素
            i.remove();
        }
        // 错误作法
        for (int i = 0; i < list.size(); i++) {
            list.remove(i);
        }
        // 错误作法
        for (String s : list) {
            list.remove(s);
        }

关于删除集合元素参考:Java循环删除集合多个元素的正确打开方式code

(2)转换
若是须要遍历全部元素,而后从新设定某些值,那么就须要李彪迭代器或者数组索引,以便设定元素的值。htm

(3)平行迭代
就是并行地同时遍历多个集合,须要显示地控制迭代器或者索引变量,以便全部迭代器或者索引变量均可以获得同步前移。blog

相关文章
相关标签/搜索