【列表迭代器和增强for循环】

列表迭代器和增强for循环

1.列表迭代器

ListIterator:列表迭代器

  • 通过List集合的listIterator()方法得到,所以说它是List集合特有的迭代器
  • 用于允许程序员沿任一方向遍历列表的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置

ListIterator中常用方法

  • E next():返回迭代中的下一个元素

  • boolean hasNext():如果迭代具有更多元素,则返回true

    package com.gather.list;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.ListIterator;
    public class ListDemo04 {
        public static void main(String[] args) {
            List<String> list=new ArrayList<String>();
            list.add("hello");
            list.add("world");
            list.add("java");
            //通过list集合的listIterator()方法得到
            ListIterator<String> lit = list.listIterator();
            while (lit.hasNext()){
                String s = lit.next();
                System.out.println(s);
            }
            System.out.println(list);
        }
    }
    

【列表迭代器和增强for循环】_第1张图片

  • E previous():返回列表中的上一个元素

  • boolean hasPrevious():如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true

    package com.gather.list;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.ListIterator;
    public class ListDemo04 {
        public static void main(String[] args) {
            List<String> list=new ArrayList<String>();
            list.add("hello");
            list.add("world");
            list.add("java");
            ListIterator<String> lit = list.listIterator();
            while (lit.hasPrevious()){
                String s = lit.previous();
                System.out.println(s);
            }
            System.out.println(list);
        }
    }
    

【列表迭代器和增强for循环】_第2张图片

  • void add(E e):将指定的元素插入列表

    package com.gather.list;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.ListIterator;
    public class ListDemo04 {
        public static void main(String[] args) {
            List<String> list=new ArrayList<String>();
            list.add("hello");
            list.add("world");
            list.add("java");
            ListIterator<String> lit = list.listIterator();
            while (lit.hasNext()){
                String s = lit.next();
                if (s.equals("world")){
                    lit.add("javaee");//将实际修改值赋值给预期修改值,两个值是一致的不会触发并发修改异常
                }
            }
            System.out.println(list);
        }
    }
    

【列表迭代器和增强for循环】_第3张图片

遍历集合,得到每一个元素,看有没有"world"这个元素,如果有,就添加一个"javaee"元素,此代码中用的是ListIterator中的add()方法添加元素,用此方法不会触发并发修改异常,原因是查看JDK帮助文档中的源码得知,有一行代码表示的是将实际修改值赋值给预期修改值,两个值是一致的所以不会触发并发修改异常

2.增强for循环

增强for:简化数组和Collection集合的遍历

  • 实现Iterable接口的类允许其对象称为增强型for语句的目标
  • 它是JDK5之后出现的,其内部原理是一个Iterator迭代器

增强for的格式

  • 格式:

    for(元素数据类型 变量名:数组或者Collection集合){

    ​ //在此处使用变量即可,该变量就是元素

    }

  • 范例:

    int[] arr={1,2,3,4,5};

    for(int i:arr){

    ​ System.out.println(i)

    }

    (1)遍历数组

    package com.gather.list;
    public class ForDemo {
        public static void main(String[] args) {
            int[] arr={1,2,3,4,5};
            for(int i:arr){
                System.out.println(i);
            }
            System.out.println("==========================");
            String[] strArray={"hello","world","java"};
            for (String s:strArray){
                System.out.println(s);
            }
        }
    }
    

【列表迭代器和增强for循环】_第4张图片

(2)遍历集合

package com.gather.list;
import java.util.ArrayList;
import java.util.List;
public class ForDemo {
    public static void main(String[] args) {
        List<String> list=new ArrayList<String>();
        list.add("hello");
        list.add("world");
        list.add("java");
        for(String s:list){
            System.out.println(s);
        }
    }
}

【列表迭代器和增强for循环】_第5张图片

3.验证:增强for循环其内部原理是一个Iterator迭代器

package com.gather.list;
import java.util.ArrayList;
import java.util.List;
public class ForDemo {
    public static void main(String[] args) {
        List<String> list=new ArrayList<String>();
        list.add("hello");
        list.add("world");
        list.add("java");
        for (String s:list){
            if (s.equals("world")){
                list.add("javaee");//ConcurrentModificationException
            }
        }

    }
}

运行此代码会发现抛出一个并发修改异常ConcurrentModificationException,这个异常是在Iterator迭代器中修改了元素的长度导致预期修改值和实际修改值不一致,一旦出现这个异常就表明增强for循环内部是一个Iterator迭代器

你可能感兴趣的:(java,jvm,数据结构)