集合--List接口

List接口

程序引例

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/*
        Collection下的子接口:List
            有序集合(有序指的是存储和取出的顺序一致)--有索引
            允许重复的元素
*/

public class ListDemo1 {
    public static void main(String[] args) {
        //创建List集合对象,使用接口多态的形式创建
        List list = new ArrayList();

        list.add("hello");
        list.add("world");
        list.add("java");
        list.add("bigdata");

        Iterator iterator = list.iterator();

        while (iterator.hasNext()) {
            Object next = iterator.next();
            //向下转型
            String s = (String) next;
            System.out.println(s + ",长度为:" + s.length());
        }
    }
}

List相关集合特有的功能

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/*
    List相关集合特有的功能
    因为List集合拥有下标索引,所以根据这个下标索引衍生出特有方法
        添加功能:
            void add(int index,Object element)
                将指定的元素插入此列表中的指定位置(可选操作)。
        删除功能:
            Object remove(int index)
                删除该列表中指定位置的元素(可选操作)。
        获取功能:
            Object get(int index)
                返回此列表中指定位置的元素。
        修改功能:
            Object set(int index,Object element)
                用指定的元素(可选操作)替换此列表中指定位置的元素。
        List特有迭代器:
            ListIterator<E> listIterator()
                返回列表中的列表迭代器(按适当的顺序)。
*/
public class ListDemo2 {
    public static void main(String[] args) {
        //创建List集合对象
        List list = new ArrayList();

        //添加元素到集合中
        list.add("hello");
        list.add("world");
        list.add("java");
        list.add("hadoop");
        System.out.println(list);//[hello,world,java,hadoop]
        System.out.println("===============================");

        //void add(int index,Object element)
        //将指定的元素插入此列表中的指定位置(可选操作)。
        //如果指数超出范围( index < 0 || index > size() )
        list.add(0, "hive");
        System.out.println(list);//[hive,hello,world,java,hadoop]
      //index > size()报错,5刚刚好是size,所以不报错。
        list.add(5, "spark");
        System.out.println(list);//[hive,hello,world,java,hadoop,spark]
      //编译没报错,运行报错了。
      //IndexOutOfBoundsException: Index: 7, Size: 6
//        list.add(7, "flink");
//        System.out.println(list);     
      
        System.out.println("********************************");
      
        //Object remove(int index)
        //删除该列表中指定位置的元素(可选操作)。
        //返回被删除的元素,类型为Object类型
        Object obj = list.remove(0);
        System.out.println(obj);
        System.out.println(list);
           
        System.out.println("******************************");
      
        //Object get(int index)
        //返回此列表中指定位置的元素。
        //不改变原集合中的元素
        Object obj2 = list.get(3);
        System.out.println(obj2);
        System.out.println(list);//
      
        System.out.println("******************************");
      
        //Object set(int index,Object element)
        //用指定的元素(可选操作)替换此列表中指定位置的元素。
        //返回的是指定位置被替换的元素
        Object obj3 = list.set(3, "flink");
        System.out.println(obj3);
        System.out.println(list);

        System.out.println("******************************");
        //获取迭代器对象
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            String s = (String) iterator.next();
            System.out.println(s + ",长度为:" + s.length());
        }
    }
}

List集合特有的迭代器:ListIterator extends Iterator

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

/*
    List集合特有的迭代器:
        ListIterator extends Iterator
        由于继承自Iterator接口,所以内部一定也有hasNext()方法和next()方法

    Object previous()返回列表中的上一个元素,并向后移动光标位置。
        可以反复调用此方法以向后方遍历列表,或者与调用next()进行混合来回。
        (请注意,对next和previous交替调用将next返回相同的元素。)
        1、该方法是倒着遍历迭代器
        2、该方法的获取元素指针与next()获取元素指针是同一个
    boolean hasPrevious()返回true如果遍历反向列表,列表迭代器有多个元素。
        (换句话说,如果previous()将返回一个元素而不是抛出异常,则返回true )。

    注意:
        要想倒着遍历,必须先正着遍历一遍。在开发中很少使用,面试中经常遇到。

*/

public class ListIteratorDemo1 {
    public static void main(String[] args) {
        //创建集合对象
        List list = new ArrayList();

        //添加元素
        list.add("hello");
        list.add("world");
        list.add("java");
        list.add("hadoop");

        ListIterator listIterator = list.listIterator();

//        while (listIterator.hasPrevious()) {
//            Object previous = listIterator.previous();
//            String s = (String) previous;
//            System.out.println(s + ",长度为:" + s.length());
//        }

        //NoSuchElementException
        //迭代器一开始的时候指针在第一个位置之前
        //所以调用previous()方法获取前一个元素,会报错
//        Object previous = listIterator.previous();
//        String s = (String) previous;
//        System.out.println(s + ",长度为:" + s.length());

        //先将指针移动到最后一个元素的位置后面
        //先正着遍历一遍
        System.out.println("正着遍历:");
        while (listIterator.hasNext()){
            Object next = listIterator.next();
            String s = (String) next;
            System.out.println(s + ",长度为:" + s.length());
        }
        System.out.println("************************************");
        System.out.println("倒着遍历:");
        //然后在倒着遍历
        while (listIterator.hasPrevious()){
            Object previous = listIterator.previous();
            String s = (String) previous;
            System.out.println(s + ",长度为:" + s.length());
        }
    }
}

List集合特有的遍历方式

import java.util.ArrayList;
import java.util.List;

/*
        List集合特有的遍历方式:
            size()方法和get()方法的结合使用
*/
public class ListDemo3 {
    public static void main(String[] args) {
        //创建集合对象
        List list = new ArrayList();

        //向集合中添加元素
        list.add("hello");
        list.add("world");
        list.add("java");
        list.add("bigdata");

        //size()方法和get()方法的结合使用
        for (int i = 0; i < list.size(); i++) {
            Object obj = list.get(i);

            //向下转型
            String s = (String) obj;
            System.out.println(s + ",长度为:" + s.length());
        }
    }
}

import java.util.ArrayList;
import java.util.List;

/*
        List集合存储学生对象,使用size()和get()方法遍历
*/
public class ListDemo4 {
    public static void main(String[] args) {
        //创建集合对象
        List list = new ArrayList();

        //创建学生对象
        Student s1 = new Student("王力宏", 45);
        Student s2 = new Student("李元浩", 22);
        Student s3 = new Student("智勋", 24);
        Student s4 = new Student("呆妹", 22);
        Student s5 = new Student("乌兹", 21);

        //将学生对象添加到集合中
        list.add(s1);
        list.add(s2);
        list.add(s3);
        list.add(s4);
        list.add(s5);

        //使用size()和get()方法遍历
        for (int i = 0; i < list.size(); i++) {
            Student student = (Student) list.get(i);
            System.out.println(student.getName() + "---" + student.getAge());
        }
    }
}

遍历中的并发修改异常

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/*
        需求:
            现在有一个集合,集合中有些字符串的元素,我想判断一下里面有没有"bigdata"这个字符串
            如果有,我们就添加一个"yes"

            ConcurrentModificationException:并发修改异常
                当不允许这样的修改时,可以通过检测到对象的并发修改的方法来抛出此异常。

            原因:
                迭代器是依赖于集合存在的,在遍历迭代器元素的时候,当我们判断成功后,往集合
                中添加了一个元素,但是呢,迭代器这个时候并不知道已经添加了元素,所以就报错了。

                简单描述为:在迭代器遍历的时候,不能通过集合去修改元素(两者的修改不是同步的)。

                解决办法:
                    1、迭代器遍历的时候,通过List特有的迭代器对象调用add()方法向集合中添加元素
                    2、集合遍历的时候,修改集合中的元素
*/

public class ListQuestion {
    public static void main(String[] args) {
        //创建一个集合对象
        List list = new ArrayList();

        list.add("hello");
        list.add("world");
        list.add("java");
        list.add("bigdata");
        list.add("hadoop");
      

//-------------- ConcurrentModificationException:并发修改异常------------      
      
        //获取迭代器对象
//        Iterator iterator = list.iterator();

//        while (iterator.hasNext()){
//            String s = (String) iterator.next();
//            if("bigdata".equals(s)){
      // ConcurrentModificationException:并发修改异常
//                list.add("yes");
//            }
//        }
      

//------------迭代器遍历的时候,修改迭代器中的元素------------------      
       
//        ListIterator listIterator = list.listIterator();
//        while (listIterator.hasNext()){
//            String s = (String) listIterator.next();
//            if("bigdata".equals(s)){
          //迭代器是遍历集合的,添加不了元素
          //此时listIterator调用的add()方法其实是调用List集合的add()方法
          //在集合里面加上新的元素
//                listIterator.add("yes"); 
//            }
//        }
          //想要看到添加的结果,就要在遍历后输出List集合中的元素
//            System.out.println(list);
      
//------------集合遍历的时候,修改集合中的元素------------------
      
        for(int i=0;i<list.size();i++){
            String s = (String) list.get(i);
            if("bigdata".equals(s)){
                list.add("yes"); //因为在List集合中没有指针的概念,所以在集合尾部添加
            }
        }

        System.out.println(list);
    }
}
posted @ 2021-12-18 22:53  赤兔胭脂小吕布  阅读(72)  评论(0编辑  收藏  举报