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]
上一篇: 二叉搜索树的原理及其实现
下一篇: 分治法、回溯法、贪心法等等算法