java集合框架之List接口详解编程语言

java集合框架之List接口详解编程语言

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


1、添加

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

boolean addAll(int index,Collection<? extends E> c),在指定的位置添加一个集合的元素


程序代码示例:

import java.util.ArrayList;

import java.util.List;

public class ListDemo1 {

    public static void main(String[] args) {

        List list1 = new ArrayList();

        list1.add(“红楼梦”);

        list1.add(“三国演义”);

        list1.add(“三国演义”);

        list1.add(null);

        System.out.println(“集合的长度:” + list1.size());

        list1.add(1, “平凡的世界”);

        System.out.println(list1);

        List list2 = new ArrayList();

        list2.add(“西游记”);

        list2.add(“水浒传”);

        list1.add(1, list2);

        System.out.println(list1);

    }

}


程序运行结果如下:

集合的长度:4

[红楼梦, 平凡的世界, 三国演义, 三国演义, null]

[红楼梦, [西游记, 水浒传], 平凡的世界, 三国演义, 三国演义, null]

可以看到List中有重复的元素以及null元素,如果指定的位置超过了集合的长度,则会报IndexOutOfBoundsException异常,如下

import java.util.ArrayList;

import java.util.List;

public class ListDemo1 {

    public static void main(String[] args) {

        List list = new ArrayList();

        list.add(“红楼梦”);

        list.add(“三国演义”);

        list.add(“西游记”);

        list.add(“水浒传”);

        System.out.println(“集合的长度:” + list.size());

        list.add(5, “平凡的世界”); // 超过了集合的最大长度

        System.out.println(list);

    }

}


程序运行结果如下:

集合的长度:4

Exception in thread “main” java.lang.IndexOutOfBoundsException: Index: 5, Size: 4

at java.util.ArrayList.rangeCheckForAdd(Unknown Source)

at java.util.ArrayList.add(Unknown Source)

    at list.ListDemo1.main(ListDemo1.java:15)

以下讲述的方法中,凡是涉及到位置的方法,如果指定的位置超过了集合的最大长度,则同样报IndexOutOfBoundsException异常。


2、获取

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

int indexOf(Object o):返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1

int lastIndexOf(Object o):返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1

List<E> subList(int fromIndex,int toIndex):返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。(如果 fromIndex 和 toIndex 相等,则返回的列表为空)


程序代码示例:

package list;

import java.util.ArrayList;

import java.util.List;

public class ListDemo2 {

    public static void main(String[] args) {

        List list = new ArrayList();

        list.add(“红楼梦”);

        list.add(“三国演义”);

        list.add(“西游记”);

        list.add(“水浒传”);

        list.add(“红楼梦”);

        Object object = list.get(0);

        System.out.println(object);

        int index = list.indexOf(“红楼梦”);

        System.out.println(“第一次出现红楼梦的索引:” + index);

        index = list.indexOf(“平凡的世界”);

        System.out.println(“第一次出现平凡的世界的索引:” + index);

        index = list.lastIndexOf(“红楼梦”);

        System.out.println(“最后一次出现红楼梦的索引:” + index);

        index = list.lastIndexOf(“平凡的世界”);

        System.out.println(“最后一次出现平凡的世界的索引:” + index);

        list = list.subList(1, 3); // 不包括3位置的元素

        System.out.println(list);

    }

}


程序运行结果如下:

红楼梦

第一次出现红楼梦的索引:0

第一次出现平凡的世界的索引:-1

最后一次出现红楼梦的索引:4

最后一次出现平凡的世界的索引:-1

[三国演义, 西游记]


3、删除

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


程序代码示例:

import java.util.ArrayList;

import java.util.List;

public class ListDemo3 {

    public static void main(String[] args) {

        List list = new ArrayList();

        list.add(“红楼梦”);

        list.add(“三国演义”);

        list.add(“西游记”);

        list.add(“水浒传”);

        int index = list.indexOf(“西游记”);

        System.out.println(“西游记原来的索引:” + index);

        Object object = list.remove(1);

        System.out.println(“删除的元素: ” + object);

        index = list.indexOf(“西游记”);

        System.out.println(“移除元素之后西游记的索引:” + index);

        System.out.println(list);

    }

}


程序运行结果如下:

西游记原来的索引:2

删除的元素: 三国演义

移除元素之后西游记的索引:1

[红楼梦, 西游记, 水浒传]


4、赋值

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


程序代码示例:

import java.util.ArrayList;

import java.util.List;

public class ListDemo4 {

    public static void main(String[] args) {

        List list = new ArrayList();

        list.add(“红楼梦”);

        list.add(“三国演义”);

        list.add(“西游记”);

        list.add(“水浒传”);

        list.set(0, “平凡的世界”);

        System.out.println(list);

    }

}


程序运行结果如下:

[平凡的世界, 三国演义, 西游记, 水浒传]


5、遍历

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

ListIterator是一个接口,继承自Iterator接口,除了拥有Iterator接口中的方法之外,还拥有一些自己特有的方法

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

E previous():返回迭代的上一个元素,并移动到上一个位置。

虽然ListIterator可以实现集合的逆向迭代,但是从Java集合框架之Collection接口中我们知道,迭代器初始状态下前面并没有任何元素,必须先正向遍历,才能逆向遍历,所以一般不使用逆向迭代。


程序代码示例:

import java.util.ArrayList;

import java.util.List;

import java.util.ListIterator;

public class ListDemo5 {

    public static void main(String[] args) {

        List list = new ArrayList();

        list.add(“红楼梦”);

        list.add(“三国演义”);

        list.add(“西游记”);

        list.add(“水浒传”);

        ListIterator it = list.listIterator();

        System.out.println(“———-逆向迭代———-“);

        while (it.hasPrevious()) {

            Object object = (Object) it.previous();

            System.out.println(object);

        }

        System.out.println(“———-正向迭代———-“);

        while (it.hasNext()) {

            Object object = it.next();

            System.out.println(object);

        }

        System.out.println(“———-逆向迭代———-“);

        while (it.hasPrevious()) {

            Object object = (Object) it.previous();

            System.out.println(object);

        }

    }

}


程序运行结果如下:

———-逆向遍历———-

———-正向遍历———-

红楼梦

三国演义

西游记

水浒传

———-逆向遍历———-

水浒传

西游记

三国演义

红楼梦

从上面结果可以看出,当第一次逆向迭代的时候并没有任何输出,当正向迭代后,迭代器到了集合的末尾之后,再次逆向迭代,这时才有输出。

上面的while循环,我们可以改成for循环


程序代码示例:

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

public class ListDemo6 {

    public static void main(String[] args) {

        List list = new ArrayList();

        list.add(“红楼梦”);

        list.add(“三国演义”);

        list.add(“西游记”);

        list.add(“水浒传”);

        for (Iterator iterator = list.iterator(); iterator.hasNext();) {

            Object object = (Object) iterator.next();

            System.out.println(object);

        }

    }

}

在效率上,或许for循环的更高,因为for循环结束之后iterator变量的作用域便结束了,iterator变量就消失了。我们还可以结合get(int index)与size()方法来遍历集合

import java.util.ArrayList;

import java.util.List;

public class ListDemo7 {

    public static void main(String[] args) {

        List list = new ArrayList();

        list.add(“红楼梦”);

        list.add(“三国演义”);

        list.add(“西游记”);

        list.add(“水浒传”);

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

            Object object = list.get(i);

            System.out.println(object);

        }

    }

}


下面再来看ListIterator中对元素进行操作的方法

void add(E e):将指定的元素插入列表

void remove():从列表中移除由 next 或 previous 返回的最后一个元素

void set(E e):用指定元素替换 next 或 previous 返回的最后一个元素


程序代码示例:

import java.util.ArrayList;

import java.util.List;

import java.util.ListIterator;

public class ListDemo8 {

    public static void main(String[] args) {

        List list = new ArrayList();

        list.add(“红楼梦”);

        list.add(“三国演义”);

        list.add(“西游记”);

        list.add(“水浒传”);

        ListIterator it = list.listIterator();

        it.add(“平凡的世界”);

        System.out.println(list);

        it.next();

        it.remove(); // 调用remove方法时需要先调用next或

                        // previous方法,否则将抛出java.lang.IllegalStateException异常

        it.next();

        it.set(“新三国演义”);// 调用remove方法时需要先调用next或

                        // previous方法,否则将抛出java.lang.IllegalStateException异常

        System.out.println(list);

    }

}


程序运行结果如下:

[平凡的世界, 红楼梦, 三国演义, 西游记, 水浒传]

[平凡的世界, 新三国演义, 西游记, 水浒传]

西游记

水浒传

有时候我们在操作集合的时候,需要对集合的元素进行添加或者是删除


程序代码示例:

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

public class ListDemo9 {

    public static void main(String[] args) {

        List list = new ArrayList();

        list.add(“红楼梦”);

        list.add(“三国演义”);

        list.add(“水浒传”);

        Iterator it = list.iterator();

        while (it.hasNext()) {

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

            if (“三国演义”.equals(s)) {

                list.add(“西游记”);

            }

        }

        System.out.println(list);

    }

}


运行这段程序,控制台将出现如下错误

Exception in thread “main” java.util.ConcurrentModificationException

at java.util.ArrayList$Itr.checkForComodi                                                                                                                                                                                fication(Unknown Source)

at java.util.ArrayList$Itr.next(Unknown S                                                                                                                                                                                ource)

at list.ListDemo9.main(ListDemo9.java:17)                                                                                                                                                                                

ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。 为什么会出现这种错误呢,这是因为迭代器是依赖于集合而存在的,在判断成功后,集合中新添加了元素,而迭代器这时还不知道,所以就报错了,这个错叫并发修改异常。报错的地方为代码17行,正是迭代器获取元素的时候。如何解决这个问题呢,既然迭代器遍历集合的时候,集合不能对元素进行操作,那么使用迭代器操作元素呢


程序代码示例:

import java.util.ArrayList;

import java.util.List;

import java.util.ListIterator;

public class ListDemo10 {

    public static void main(String[] args) {

        List list = new ArrayList();

        list.add(“红楼梦”);

        list.add(“三国演义”);

        list.add(“水浒传”);

        ListIterator it = list.listIterator();

        while (it.hasNext()) {

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

            if (“三国演义”.equals(s)) {

                it.add(“西游记”);

            }

        }

        System.out.println(list);

    }

}


这时候控制台的没有报错了

[红楼梦, 三国演义, 西游记, 水浒传]

用迭代器添加的元素时,元素的位置为当前迭代器的位置,换个角度想一下,既然迭代器遍历集合的时候,迭代器可以对集合的元素进行操作,那么集合遍历元素的时候,集合是否也可以对元素进行操作呢


程序代码示例:

import java.util.ArrayList;

import java.util.List;

import java.util.ListIterator;

public class ListDemo10 {

    public static void main(String[] args) {

        List list = new ArrayList();

        list.add(“红楼梦”);

        list.add(“三国演义”);

        list.add(“水浒传”);

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

            if (“水浒传”.equals(list.get(i))) {

                list.add(“西游记”);

            }

        }

        System.out.println(list);

    }

}


程序运行结果如下:

[红楼梦, 三国演义, 水浒传, 西游记]

java集合框架之List接口详解编程语言

转载请注明来源网站:blog.ytso.com谢谢!

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/14672.html

(0)
上一篇 2021年7月19日 17:03
下一篇 2021年7月19日 17:03

相关推荐

发表回复

登录后才能评论