zoukankan      html  css  js  c++  java
  • Java API —— List接口&ListIterator接口

    1、List接口概述

            有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
            与 set 不同,列表通常允许重复的元素。
     
    例子1:
    package listdemo;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    /**
     * Created by gao on 15-12-14.
     */
    public class ListDemo01 {
        public static void main(String[] args) {
            // 创建集合对象
            List list = new ArrayList();
            // 创建字符串并添加字符串
            list.add("hello");
            list.add("world");
            list.add("java");
            // 遍历集合
            Iterator it = list.iterator();
            while (it.hasNext()){
                String s = (String)it.next();
                System.out.println(s);
            }
        }
    }
    输出结果:
    hello
    world
    java
     
    例子2:
    package listdemo;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    /**
     * Created by gao on 15-12-14.
     */
    /*
     * List集合的特点:
     *         有序(存储和取出的元素一致),可重复的。
     */
    public class ListDemo02 {
        public static void main(String[] args) {
            // 创建集合对象
            List list = new ArrayList();
            // 存储元素
            list.add("hello");
            list.add("world");
            list.add("java");
            list.add("javaee");
            list.add("android");
            list.add("javaee");//可重复
            list.add("android");//可重复
            // 遍历集合
            Iterator it = list.iterator();
            while (it.hasNext()){
                String s = (String)it.next();
                System.out.println(s);
            }
        }
    }
    输出结果:
    hello
    world
    java
    javaee
    android
    javaee
    android
     
    例子3:
    package listdemo;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    /**
     * Created by gao on 15-12-14.
     */
    /*
     * 存储自定义对象并遍历
     */
    public class ListDemo03 {
        public static void main(String[] args) {
            // 创建集合对象
            List list = new ArrayList();
            // 创建学生对象
            Student s1 = new Student("白骨精", 30);
            Student s2 = new Student("蜘蛛精", 40);
            Student s3 = new Student("观音姐姐", 22);
            // 把学生对象添加到集合对象中
            list.add(s1);
            list.add(s2);
            list.add(s3);
            // 遍历
            Iterator it = list.iterator();
            while (it.hasNext()) {
                Student s = (Student) it.next();
                System.out.println(s.getName() + "---" + s.getAge());
            }
        }
    }

    输出结果:

    白骨精---30
    蜘蛛精---40
    观音姐姐---22
     
     List集合的特有功能:
        A:添加功能
        void add(int index,Object element):在指定位置添加(插入)元素
        B:获取功能
        Object get(int index):获取指定位置的元素
        C:列表迭代器
        ListIterator listIterator():List集合特有的迭代器
        D:删除功能
        Object remove(int index):根据索引删除元素,返回被删除的元素
        E:修改功能
        Object set(int index,Object element):根据索引修改元素,返回被修饰的元素
     
    例子1:
    package listdemo;
    import java.util.ArrayList;
    import java.util.List;
    /**
     * Created by gao on 15-12-14.
     */
    /*
     * List集合的特有功能:
     * A:添加功能
     *         void add(int index,Object element):在指定位置添加元素
     * B:获取功能
     *         Object get(int index):获取指定位置的元素
     * C:列表迭代器
     *         ListIterator listIterator():List集合特有的迭代器
     * D:删除功能
     *         Object remove(int index):根据索引删除元素,返回被删除的元素
     * E:修改功能
     *         Object set(int index,Object element):根据索引修改元素,返回被修饰的元素
     */
    public class ListDemo04 {
        public static void main(String[] args) {
            // 创建集合对象
            List list = new ArrayList();
            // 添加元素
            list.add("hello");
            list.add("world");
            list.add("java");
            // void add(int index,Object element):在指定位置添加元素
    //        list.add("andorid");
    //        System.out.println("list:"+list);//list:[hello, world, java, andorid]
    //        list.add(3,"javaee");
    //        System.out.println("list:"+list);//list:[hello, world, java, javaee]
    //        list.add(4,"javaee");
    //        System.out.println("list:"+list);//IndexOutOfBoundsException: Index: 4, Size: 3
    //        list.add(11,"javaee");
    //        System.out.println("list:"+list);//IndexOutOfBoundsException: Index: 11, Size: 3
            // Object get(int index):获取指定位置的元素
    //        System.out.println("get:"+list.get(1)); //get:world
    //        System.out.println("get:"+list.get(11)); //IndexOutOfBoundsException: Index: 11, Size: 3
            // Object remove(int index):根据索引删除元素,返回被删除的元素
    //        System.out.println("remove:"+list.remove(1)); //remove:world
    //        System.out.println("list:"+list); //list:[hello, java]
    //        System.out.println("remove:" + list.remove(11)); //IndexOutOfBoundsException
            // Object set(int index,Object element):根据索引修改元素,返回被修饰的元素
            System.out.println("set:"+list.set(1,"javaee")); //set:world
            System.out.println("list:"+list); //list:[hello, javaee, java]
        }
    }

    例子2:List特有的遍历方法size和get方法结合

    package listdemo;
    import java.util.ArrayList;
    import java.util.List;
    /**
     * Created by gao on 15-12-14.
     */
    public class ListDemo05 {
        public static void main(String[] args) {
            // 创建集合对象
            List list = new ArrayList();
            // 添加元素
            list.add("hello");
            list.add("world");
            list.add("java");
            //遍历
            for (int x = 0; x < list.size(); x++){
                String s = (String) list.get(x);
                System.out.println(s);
            }
        }
    }

    例子3:

    package listdemo;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    /**
     * Created by gao on 15-12-14.
     */
    public class ListDemo06 {
        public static void main(String[] args) {
            // 创建集合对象
            List list = new ArrayList();
            // 创建学生对象
            Student s1 = new Student("林黛玉", 18);
            Student s2 = new Student("刘姥姥", 88);
            Student s3 = new Student("王熙凤", 38);
            // 把学生添加到集合中
            list.add(s1);
            list.add(s2);
            list.add(s3);
            // 遍历
            // 迭代器遍历
            Iterator it = list.iterator();
            while (it.hasNext()) {
                Student s = (Student) it.next();
                System.out.println(s.getName() + "---" + s.getAge());
            }
            System.out.println("-------------------");
            for (int x = 0; x < list.size(); x++) {
                Student s = (Student) list.get(x);
                System.out.println(s.getName() + "---" + s.getAge());
            }
        }
    }
    2、ListIterator接口(列表迭代器)
        · ListIterator接口的成员方法
            boolean hasPrevious()
            E previous()
        · ConcurrentModificationException
            现象
            原因
            解决方案
     
    例子1:
    package listiteratordemo;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.ListIterator;
    /**
     * Created by gao on 15-12-14.
     */
    /*
     * 列表迭代器:
     *         ListIterator listIterator():List集合特有的迭代器
     *         该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法。
     *
     * 特有功能:
     *         Object previous():获取上一个元素
     *         boolean hasPrevious():判断是否有元素
     *
     *         注意:ListIterator可以实现逆向遍历,但是必须先正向遍历,才能逆向遍历,所以一般无意义,不使用。
     */
    public class ListIteratorDemo01 {
        public static void main(String[] args) {
            // 创建List集合对象
            List list = new ArrayList();
            list.add("hello");
            list.add("world");
            list.add("java");
            // ListIterator listIterator()
            ListIterator lit = list.listIterator(); // 子类对象
            while (lit.hasNext()) {
            String s = (String) lit.next();
            System.out.println(s);
            }
            System.out.println("-----------------");
            while(lit.hasPrevious()){
                String s = (String)lit.previous();
                System.out.println(s);
            }
        }
    }
    输出结果:
    hello
    world
    java
    -----------------
    java
    world
    hello
     
    例子2:
    package listiteratordemo;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.ListIterator;
    /**
     * Created by gao on 15-12-14.
     */
    /*
     * 问题?
     *         我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。
     *
     * ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
     * 产生的原因:
     *         迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。
     *         其实这个问题描述的是:迭代器遍历元素的时候,通过集合是不能修改元素的。
     * 如何解决呢?
     *         A:迭代器迭代元素,迭代器修改元素
     *             元素是跟在刚才迭代的元素后面的。
     *         B:集合遍历元素,集合修改元素(普通for)
     *             元素在最后添加的。
     */
    public class ListIteratorDemo02 {
        public static void main(String[] args) {
    // 创建List集合对象
            List list = new ArrayList();
            // 添加元素
            list.add("hello");
            list.add("world");
            list.add("java");
            // 迭代器遍历
    //        Iterator it = list.iterator();
            //有问题!!ConcurrentModificationException
    //        while (it.hasNext()) {
    //            String s = (String) it.next();
    //            if ("world".equals(s)) {
    //                list.add("javaee");
    //            }
    //        }
            // 方式1:迭代器迭代元素,迭代器修改元素
            // 而Iterator迭代器却没有添加功能,所以我们使用其子接口ListIterator
    //        ListIterator lit = list.listIterator();
    //        while (lit.hasNext()) {
    //            String s = (String) lit.next();
    //            if ("world".equals(s)) {
    //                lit.add("javaee");
    //            }
    //        }
    //        System.out.println("list:" + list); //list:[hello, world, javaee, java]
            System.out.println("-----------------");
            // 方式2:集合遍历元素,集合修改元素(普通for)
            for (int x = 0; x < list.size(); x++) {
                String s = (String) list.get(x);
                if ("world".equals(s)) {
                    list.add("javaee");
                }
            }
            System.out.println("list:" + list); //list:[hello, world, java, javaee]
        }
    }
    3、面试题List的子类特点:
      ArrayList:
        底层数据结构是数组,查询快,增删慢。
        线程不安全,效率高。(异步)
      Vector:(不常用)
        底层数据结构是数组,查询快,增删慢。
        线程安全,效率低。(同步)
      LinkedList:
        底层数据结构是链表,查询慢,增删快。
        线程不安全,效率高。
      List有三个儿子,我们到底使用谁呢?
        看需求(情况)。
              要安全吗?
              要:Vector(即使要安全,也不用这个了,后面有替代的
              不要:ArrayList或者LinkedList
           查询多:ArrayList
           增删多:LinkedList
     
      如果你什么都不懂,就用ArrayList。
     
     
     
  • 相关阅读:
    Java日期时间API系列1-----Jdk7及以前的日期时间类
    Redis设置密码,保护数据安全
    Java SE 8 并发增强
    Java8并发教程:Threads和Executors
    MySQL5.7增量备份恢复全实战
    HashSet HashMap 源码阅读笔记
    操作系统知识点
    Window批处理命令
    JS典型题
    SiteMesh装饰模式
  • 原文地址:https://www.cnblogs.com/yangyquin/p/5047530.html
Copyright © 2011-2022 走看看