欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java 集合框架 List的方法,List集合特有的遍历功能,listIterator的功能,并发修改异常ConcurrentModificationException的原因和解决办法

程序员文章站 2022-03-30 22:58:10
...

集合继承体系图

Java 集合框架 List的方法,List集合特有的遍历功能,listIterator的功能,并发修改异常ConcurrentModificationException的原因和解决办法
还是这个图,上一篇学了Collection接口,这篇讲的是List接口。
上篇链接:https://blog.csdn.net/weixin_43580841/article/details/107446358
Java 集合框架 Collection的介绍和常用方法,iterator迭代器遍历集合的方法和原理

List底下三个类:
Arraylist:底层数据结构是数组(顺序表),查询快,增删慢。线程不安全,效率高。
Vector:底层数据结构是数组(顺序表),查询快,增删慢。线程安全,效率低。
LinkedList:底层数据结构是链表,查询慢,增删快。线程不安全,效率高。

注意:API中List有两个,要使用集合List导包时选择的是java.util.List。

List集合的特有方法(指定索引或元素增删改查)

因为List是继承自Collection的,所以Collection有的方法List都有,这里不再赘述,可参考上篇。
使用add(int index, E element) 方法在特定位置插入元素,要注意索引不能越界,索引最大值为元素个数。
addAll(int index, Collection<? extends E> c) 在特定位置插入另一个集合的全部元素。

List l = new ArrayList();
l.add("a");
l.add("b");
l.add(0,"c");
System.out.println(l);

运行结果:[c, a, b]

get(int index) 返回此列表中指定位置的元素(要注意索引是否越界)。
indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
lastIndexOf方法返回指定元素最后一次出现的索引,没找到返回-1。

List l = new ArrayList();
l.add("a");
l.add("b");
l.add(0,"c");
System.out.println(l.get(1));
System.out.println(l.indexOf("b"));

运行结果:a
2

remove方法:
remove(int index) 删除该列表中指定位置的元素。
boolean remove(Object o) 从列表中删除第一个出现的指定元素(如果存在)

List l = new ArrayList();
l.add(1);
l.add(0);
l.add("b");
l.add(2);
l.add("b");

l.remove(1);
System.out.println(l);
l.remove("b");
System.out.println(l);

[1, b, 2, b]
[1, 2, b]

subList(int fromIndex, int toIndex) 方法截取子集合(包含头,不包含尾):

List l = new ArrayList();
l.add(1);
l.add(0);
l.add("b");
l.add(2);
l.add("b");

List newList = l.subList(1,3);
System.out.println(l);
System.out.println(newList);

[1, 0, b, 2, b]
[0, b]

List集合特有的遍历功能

只支持List集合,set集合不可,因为set集合没有索引。

List l = new ArrayList();
l.add(1);
l.add(0);
l.add(3);
l.add(4);
l.add(5);

for (int index = 0 ;index<l.size();index++){
    System.out.println(l.get(index));
}

listIterator的功能

这个只有List派系的可以用。
Java 集合框架 List的方法,List集合特有的遍历功能,listIterator的功能,并发修改异常ConcurrentModificationException的原因和解决办法
倒着遍历:

List l = new ArrayList();
for (ListIterator lI = l.listIterator();lI.hasPrevious();){
    System.out.println(lI.previous());
}

如果想在遍历过程中添加数据,不能在循环中通过List的add方法来添加。
下面会出现并发修改异常ConcurrentModificationException,因为迭代器还在读取List的元素,List集合就开始插入元素。(两个对象同时操作一个数据,解决办法就是让干这两件事的变成同一个对象,使用ListIterator迭代器的add方法)

List l = new ArrayList();
l.add(1);
l.add(2);
l.add(4);
for (ListIterator lI = l.listIterator();lI.hasNext();){
    if(lI.next().equals(2)){
        l.add(3);
    }
}

解决办法:

List l = new ArrayList();
l.add(1);
l.add(2);
l.add(4);
for (ListIterator lI = l.listIterator();lI.hasNext();){
    if(lI.next().equals(2)){
        lI.add(3);
    }
}
System.out.println(l);

[1, 2, 3, 4]