集合(10):增强for循环的概述和使用

增强for循环属于JDK1.5之后的特性

到目前为止,学过哪些特性是JDK1.5之后出现的:泛型,增强for,包装类,Scanner,枚举

一、增强for循环的介绍

1、增强for循环概述
简化数组和Collection集合的遍历
2、格式
格式:
    for(元素数据类型 变量名(自定义) : 数组或者Collection集合) {
     使用变量即可,该变量就是元素
    }
快捷键:iter回车
3、好处及其注意事项
好处:
(1)简化遍历
(2)将来能用增强for的时候,就用增强for,可以消除黄色警告线

注意事项:增强for的目标要判断是否为null
把前面的集合代码的遍历用增强for改进

二、增强for循环的应用

1、遍历数组
public class ForDemo1 {
    public static void main(String[] args) {
        //定义一个数组
        int[] arr = {1,2,3,4,5,6};

        System.out.println("====普通for循环遍历====");
        for(int i=0;i<arr.length;i++){
            System.out.println(arr[i]);
        }

        System.out.println("====增强for循环遍历====");
        for(int x : arr){
            System.out.println(x);
        }
        
        执行结果为:
        ====普通for循环遍历====
        1
        2
        3
        4
        5
        6
        ====增强for循环遍历====
        1
        2
        3
        4
        5
        6

        Process finished with exit code 0
       //二者遍历的效果一样,只是增强for循环更简化一点
2、遍历Collection集合
public class ForDemo1 {
    public static void main(String[] args) {
        //创建Collection子类的对象,加上泛型
        ArrayList<String> strings = new ArrayList<>();
        //向集合中添加元素
        strings.add("hello");
        strings.add("world");
        strings.add("java");
        strings.add("bigdata");
        strings.add("hadoop");

         for (String string : strings) {
            System.out.println(string);
         }

         /*
            创建对象的时候,指针指向地址值;在以后的开发中,
            如果一不小心strings = null;那么遍历的时候就会报错
            所以我们在遍历之前需要判断一下是不是为null
          */
        System.out.println("====加入判断====");
        if(strings!=null){
            for (String s : strings){
                System.out.println(s);
            }
        }
    }
}

执行结果如下:

hello
world
java
bigdata
hadoop
====加入判断====
hello
world
java
bigdata
hadoop

Process finished with exit code 0

由此可见,使用增强for循环的时候,可以多次遍历;

而使用迭代器遍历的时候,调用一次迭代器,只能遍历一次

增强for循环并不是万能的,在遍历的时候添加元素,会并发修改异常,

这时候就不能使用增强for循环,只能使用迭代器

public class ForDemo1 {
    public static void main(String[] args) {
        //创建Collection子类的对象,加上泛型
        ArrayList<String> strings = new ArrayList<>();
        //向集合中添加元素
        strings.add("hello");
        strings.add("world");
        strings.add("java");
        strings.add("bigdata");
        strings.add("hadoop");

        /*
        	 for(String s:strings){
             if("world".equals(s)){
                 strings.add("spark");
             }
           }
        使用增强for循环,在遍历的时候添加元素,执行时会报错
        */

        ListIterator<String> iterator = strings.listIterator();
         while (iterator.hasNext()){
             String next = iterator.next();
             if("world".equals(next)){
             /*
                 添加元素的时候,
                 不能使用strings.add("spark");来添加元素,会报错
                 必须使用迭代器名调用,iterator.add("spark");
                 迭代器调用方法的时候,底层是调用集合的方法;
                 最终添加的元素会添加到集合里面去,而不会添加到迭代器里
             */
                 iterator.add("spark");
             }
             System.out.println(next);
         }
        System.out.println(strings);
    }
}

执行结果如下:

hello
world
java
bigdata
hadoop
[hello, world, spark, java, bigdata, hadoop]

Process finished with exit code 0