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派系的可以用。
在这里插入图片描述
倒着遍历:

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]

猜你喜欢

转载自blog.csdn.net/weixin_43580841/article/details/107462169