List集合
概述
public interface List<E> extends Collection<E>
-
有序集合(也称为序列 )。 该界面的用户可以精确控制列表中每个元素的插入位置。 用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。
-
与Set集合不同,列表通常允许重复的元素。
特点:
-
有序:储存和取出的元素顺序一致
-
元素可重复
使用方法
List<String> l = new ArrayList<String>(); //以多态的方式创建对象
常用方法
-
该接口继承至Collection集合,在拥有Collection集合的全部方法的同时:
List 集合特有的方法 void add(int Index , E e) //在指定位置插入指定元素(原有元素之前) E remove(int Index) //删除指定索引处的元素,返回被删除的元素 E set(int index,E e) //修改指定索引处的元素,返回被修改的元素 E get(int index) //返回指定的索引处的值
遍历方法
-
采用Collection集合中也有的: Iterator() 方法进行遍历
-
采用set()与get()方法,for循环
//get()方法 for(int i = 0 ; i<list.size();i++){ String s = list.get(i); System.out.println(s); }
并发修改异常
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class demo { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("hello"); list.add("java"); list.add("world"); Iterator<String> it = list.listIterator(); while (it.hasNext()){ String s = it.next(); //ConcurrentModificationException if (s.equals("world")){ list.add("oh"); } } System.out.println(list); } }
-
ConcurrentModificationException:当不允许这样的修改时,可以通过检测到对象的并发修改的方法来抛出此异常。
-
在迭代器迭代对象的时候,不允许修改集合中的元素个数,造成了迭代器获取元素中判断预期修改值和实际修改值不一致(分析源码)
解决方案
-
用for循环遍历即可
for (int i = 0; i < list.size(); i++) { String s = list.get(i); if (s.equals("world")){ list.add("oh"); } }
-
方案二:ListIterator列表迭代器进行add
ListIterator:列表迭代器
-
通过List集合的listIterator()方法得到,他是List集合中特有的迭代器
public interface ListIterator<E> extends Iterator<E>
-
用于允许程序员沿任一方向遍历列表的列表的迭代器,在迭代期间*修改列表,并获取列表中迭代器的当前位置(与Iterator对比的不同之处)
- 常用方法
void | add(E e) 将指定的元素插入列表(可选操作)。 |
---|---|
boolean | hasNext() 返回 true 如果遍历正向列表,列表迭代器有多个元素。 |
boolean | hasPrevious() 返回 true 如果遍历反向列表,列表迭代器有多个元素。 |
E | next() 返回列表中的下一个元素,并且前进光标位置。 |
int | nextIndex() 返回随后调用 next()返回的元素的索引。 |
E | previous() 返回列表中的上一个元素,并向后移动光标位置。 |
int | previousIndex() 返回由后续调用 previous()返回的元素的索引。 |
void | remove() 从列表中删除由 next()或 previous()返回的最后一个元素(可选操作)。 |
void | set(E e) 用 指定的元素替换由 next()或 previous()返回的最后一个元素(可选操作)。 |
使用
Iterator<String> it = list.listIterator(); ListIterator<String> lit = list.listIterator(); //正向遍历 while (lit.hasNext()){ String s = lit.next(); System.out.println(s); } //逆向遍历,很少用 while (lit.hasPrevious()){ String s = lit.previous(); System.out.println(s); } //重点掌握,add方法 while (lit.hasNext()){ String s = lit.next(); if (s.equals("java")){ lit.add("oh"); //[hello, java, oh, world] 没有异常 } }
-
使用add在迭代器中添加元素时不会抛出ConcurrentModificationException
增强for循环
作用:简化数组 和Colleciton集合的遍历
-
使用范围:实现Iterator接口的类的对象
-
JDK 5 之后出现,内部原理是一个Iterator迭代器
格式
int[] arr = {3,2,1,56,77,9} for(int i ; arr){ System.out.println(i); }
for(String s : list ) { if (s.equals("hello")){ list.add("oh"); //ConcurrentModificationException,抛出该异常说明内部为迭代器 } }