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。

时间: 2024-08-06 03:28:35

Java API —— List接口&ListIterator接口的相关文章

JAVA-初步认识-常用对象API(集合框架-ListIterator接口)

一. 把list往外取的动作也说一下,(有可能说的是从list中取出元素的动作). 从list中取出所有的元素,采用iterator,因为list属于Colletion的子类,Colletion中具备的东西list也都有.(上面的截图中list只是一个空的容器,然后不断地往里面添加元素,或者删减元素)返回了iterator是怎么理解? DOS结果没有任何问题. list有自己特有的元素取出方式,list.get(index),输入集合中的某一个角标值,打印出来的结果就是该角标上的元素. 如果是取

Java API ——Collection集合类 &amp; Iterator接口

对象数组举例: 学生类: package itcast01; /** * Created by gao on 15-12-9. */ public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() {

在Java API设计中,面向接口编程的思想,以及接口和工厂的关系

现在的java API的设计中,提倡面向接口的编程,即在API的设计中,参数的传递和返回建议使用接口,而不是具体的实现类,如一个方法的输入参数类型应该使用Map接口,而不是HashMap或Hashtable等具体的实现类.这样做的好处是,程序容易扩展.如果使用Map作为参数,用户可以使用任何实现Map接口的类作为参数,而不是仅仅限制使用HashMap或Hashtable作为参数,使程序的实现更加灵活. 接口(Java的Interface),只定义了一些抽象的方法(也可以定义一些常量,但不鼓励这么

掌握HDFS的Java API接口访问

HDFS设计的主要目的是对海量数据进行存储,也就是说在其上能够存储很大量文件(可以存储TB级的文件).HDFS将这些文件分割之后,存储在不同的DataNode上, HDFS 提供了两种访问接口:Shell接口和Java API 接口,对HDFS里面的文件进行操作,具体每个Block放在哪台DataNode上面,对于开发者来说是透明的. 1.获取文件系统 1 /** 2 * 获取文件系统 3 * 4 * @return FileSystem 5 */ 6 public static FileSys

熟练掌握HDFS的Java API接口访问

HDFS设计的主要目的是对海量数据进行存储,也就是说在其上能够存储很大量文件(可以存储TB级的文件).HDFS将这些文件分割之后,存储在不同的DataNode上, HDFS 提供了两种访问接口:Shell接口和Java API 接口,对HDFS里面的文件进行操作,具体每个Block放在哪台DataNode上面,对于开发者来说是透明的. 通过Java API接口对HDFS进行操作,我将其整理成工具类,地址见底部 1.获取文件系统 1 /** 2 * 获取文件系统 3 * 4 * @return F

【Java学习笔记】&lt;集合框架&gt;Iterator的子接口ListIterator

1 import java.util.ArrayList; 2 import java.util.Iterator; 3 import java.util.List; 4 5 public class Test3 { 6 7 public static void main(String[] args) { 8 List list = new ArrayList(); 9 10 list.add("abc1"); 11 list.add("abc2"); 12 lis

Java集合框架中List接口的简单使用

Java集合框架可以简单的理解为一种放置对象的容器,和数学中的集合概念类似,Java中的集合可以存放一系列对象的引用,也可以看做是数组的提升,Java集合类是一种工具类,只有相同类型的对象引用才可以放到同一个集合中,否则是不能放进去的: 集合可以对元素进行简单快速的查找.插入.删除操作 某些集合可以有<key value>映射的关系 数组的长度是固定的,而集合的长度是跟随元素的个数动态变化的,灵活性和扩展性都比数组更加优越 数组只能存放基本类型的数据,而集合存放的是对象引用类型的 数组只能通过

ListIterator接口,双向输出。

1,ListIterator接口与Itreator接口的区别. 2,使用限制. 定义如下: public interface ListIterator<E>extends Iterator<E> 常用方法: 虽然此接口可以实现双向输出,但是collection接口并没有为此类定义实例化的操作. 只要List接口中才存在ListIterator接口的实例化操作. 范例:完成双向输出: package 类集; import java.util.ArrayList; import jav

Java集合框架之List接口

在上一篇Java集合框架之Collection接口中我们知道List接口是Collection接口的子接口,List接口对Collection进行了简单的扩充,List接口中的元素的特点为有序,可重复,允许null值,因为List继承了Collection接口,所以继承自Collection接口中的方法不再赘述,从List接口中的方法来看,List接口主要是增加了面向位置的操作,允许在指定位置上对集合中的元素进行操作,同时增加了一个能够双向遍历线性表的新列表迭代器ListIterator.下面介