Java_集合04_集合(List)

Posted zhaolanqi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java_集合04_集合(List)相关的知识,希望对你有一定的参考价值。

集合(List)

1.    List集合的特点

List:保存元素加入的顺序(存储顺序和取出顺序一致),可以保存重复值

|--    ArrayList:线性数据结构(底层数据结构是数组)。查询快,增删慢。线程不安全,效率高。创建集合时可以指定集合的长度。

|--    Vector:线性数据结构(底层数据结构是数组)。查询快,增删慢。线程安全,效率低。功能与ArrayList完全一致。

|--    LinkedList:链表数据结构(底层数据结构是链表)。查询慢,增删快。线程不安全,效率高。创建集合时不能指定集合的长度。

2.    List是Collection的子接口

有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

与 set 不同,列表通常允许重复的元素。

/***************************************************************************************************************************************************/

//存储字符串并遍历

public class ListDemo {

    public static void main(String[] args) {

        // 创建集合对象

        List list = new ArrayList();//

 

        // 存储元素

        list.add("hello");// ArrayList类中的add()永远返回true,所以可重复

        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);

        }

    }

}

/***************************************************************************************************************************************************/

//存储自定义对象并遍历

public class ListDemo {

    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());

        }

    }

}

public class Student {

    private String name;

    private int age;

    public Student() {    }

    public Student(String name, int age) {

        super();

        this.name = name;

        this.age = age;

    }

    // getXxx()/setXxx()

}

/***************************************************************************************************************************************************/

3.    List的特有功能:(将 E 看成Object)

A:添加功能

void add(int index, E element):在列表的指定位置插入指定元素(可选操作)。将当前处于该位置的元素(如果有的话)和所有后续元素向右移动(在其索引中加 1)。

B:删除功能

E remove(int index):移除列表中指定位置的元素(可选操作)。将所有的后续元素向左移动(将其索引减 1)。返回从列表中移除的元素。

boolean remove(Object o):从此列表中移除第一次出现的指定元素(如果存在)(可选操作)。如果列表不包含元素,则不更改列表。

C:获取功能

E get(int index):返回:列表中指定位置的元素。

D:列表迭代器(List集合特有的迭代器

ListIterator<E> listIterator():返回此列表元素的列表迭代器(按适当顺序)。

boolean hasPrevious():返回: 如果以逆向遍历列表,列表迭代器有多个元素,则返回 true

E previous():返回: 列表中的上一个元素。 抛出: NoSuchElementException - 如果没有可迭代的上一个元素

E:修改功能

E set(int index, E element):用指定元素替换列表中指定位置的元素(可选操作)。返回:以前在指定位置的元素。

/***************************************************************************************************************************************************/

public class ListDemo {

    public static void main(String[] args) {

        // 创建集合对象

        List list = new ArrayList();

 

        // 添加元素

        list.add("hello");

        list.add("world");

        list.add("java");

        

        // void add(int index, E element):在指定位置添加元素

        // list.add(1, "android");//没有问题

        

        // list.add(3, "javaee"); //没有问题

        // list.add(4, "javaee"); // IndexOutOfBoundsException

 

        // Object get(int index):获取指定位置的元素

        // System.out.println("get:" + list.get(1));// get:world

        // System.out.println("get:" + list.get(3));// IndexOutOfBoundsException

 

        // Object remove(int index):根据索引删除元素,返回被删除的元素

        // System.out.println("remove:" + list.remove(1));

        // 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);

    }

}

/***************************************************************************************************************************************************/

4.    List集合的特有遍历功能

        A:由size()和get()结合。

        B:代码演示

/***************************************************************************************************************************************************/

        //存储字符串并遍历

// 创建集合对象

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);

}

        

// List集合的特有遍历功能

for (int x = 0; x < list.size(); x++) {

String s = (String) list.get(x);

System.out.println(s);

}

/***************************************************************************************************************************************************/

//存储自定义对象并遍历

public class ListDemo {

    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());

        }

 

        // 普通for循环

        for (int x = 0; x < list.size(); x++) {

            Student s = (Student) list.get(x);

            System.out.println(s.getName() + "---" + s.getAge());

        }

    }

}

public class Student {

    private String name;

    private int age;

    public Student() {}

    public Student(String name, int age) {

        super();

        this.name = name;

        this.age = age;

    }

    // getXxx()/setXxx()

}

/***************************************************************************************************************************************************/

5.    列表迭代器的特有功能;(了解)

        可以逆向遍历,但是要先正向遍历,所以无意义,基本不使用。

/***************************************************************************************************************************************************/

/*

* 列表迭代器:

*         ListIterator<E> listIterator():List集合特有的迭代器

*         该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()next()方法。

* 特有功能:

*         E previous():获取上一个元素

*         boolean hasPrevious():判断是否有元素

*

*         注意:ListIterator可以实现逆向遍历,但是必须先正向遍历,才能逆向遍历,所以一般无意义,不使用。

*/

public class ListIteratorDemo {

    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);

        }// 该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()next()方法。

 

        // System.out.println(lit.previous());

        // System.out.println(lit.previous());

        // System.out.println(lit.previous());

        // System.out.println(lit.previous());// NoSuchElementException

 

        while (lit.hasPrevious()) {

            String s = (String) lit.previous();

            System.out.println(s);

        }

 

        // 迭代器

        Iterator it = list.iterator();

        while (it.hasNext()) {

            String s = (String) it.next();

            System.out.println(s);

        }

    }

}

/***************************************************************************************************************************************************/

6.    并发修改异常:ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。

        A:出现的现象

            迭代器遍历集合过程中,通过集合对象修改集合元素。

        B:原因

            迭代器是依赖于集合的,而集合的改变迭代器并不知道。所以,迭代器遍历元素的过程中,通过集合是不能修改元素的。

        C:解决方案

            a:迭代器遍历,迭代器修改(ListIterator)

                元素添加在刚才迭代的位置

            b:集合遍历,集合修改(用for循环加上List集合的size()和get()方法,Collection集合没有get()方法)

                元素添加在集合的末尾

/***************************************************************************************************************************************************/

//判断集合里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。

public class ListIteratorDemo {

    public static void main(String[] args) {

        // 创建List集合对象

        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);

//            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");

//            }

//        }

 

        // 方式2:集合遍历元素,集合修改元素(普通for)

        for (int x = 0; x < list.size(); x++) {

            String s = (String) list.get(x);

            if ("world".equals(s)) {

                list.add("javaee");

//                list.set(x, "javaee");// 用指定的元素替代此列表中指定位置上的元素。

            }

        }

        System.out.println("list:" + list);

    }

}

/***************************************************************************************************************************************************/

7.    List的子类特点(面试题)

        ArrayList

            底层数据结构是数组,查询快,增删慢。

            线程不安全,效率高。

        Vector

            底层数据结构是数组,查询快,增删慢。

            线程安全,效率低。

        LinkedList

            底层数据结构是链表,查询慢,增删快。

            线程不安全,效率高。

            

        到底使用谁呢?看需求?

        分析:

            要安全吗?

                要:Vector(即使要,也不使用这个,后面再说)

                不要:ArrayList或者LinkedList

                    查询多;ArrayList

                    增删多:LinkedList

                    

        什么都不知道,就用ArrayList。

8.    List集合的案例(遍历方式 迭代器和普通for)

        A:存储字符串并遍历

        B:存储自定义对象并遍历

以上是关于Java_集合04_集合(List)的主要内容,如果未能解决你的问题,请参考以下文章

Java_集合05_集合(List)的子类

Java基础_List集合

Java_集合框架

集合00_Java集合框架

JAVA集合02_List集合的概述并发修改异常迭代器遍历子类对比

集合类不安全_List_Set_HashMap