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。
 
 
 
posted @ 2015-12-15 11:08  我是一名老菜鸟  阅读(1569)  评论(0编辑  收藏  举报