目录
一、List接口的概述
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。
用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
与 set 不同,列表通常允许重复的元素。
注:有序是指存储的顺序和取出的顺序一致。
二、List相对于Collection的特有功能
A:添加功能
void add(int index,Object element):在指定位置添加元素
B:获取功能
Object get(int index):获取指定位置的元素
C:删除功能
Object remove(int index):根据索引删除元素,返回被删除的元素
D:修改功能
Object set(int index,Object element):根据索引修改元素,返回被修饰的元素
E:列表迭代器
ListIterator listIterator():List集合特有的迭代器
案例:
//创建集合对象
List list=new ArrayList();
//添加元素
list.add("hello");
list.add("world");
list.add("java");
1.添加功能
//void add(int index,Object element):在指定位置添加元素
list.add(1, "android");//没有问题
list.add(3, "android");//紧跟在最后一个元素的后面不会报索引越界
list.add(11,"android");//java.lang.IndexOutOfBoundsException: Index: 11索引越界
2.获取功能
//Object get(int index):获取指定位置的元素
list.get(1);//没有问题
list.get(11);//java.lang.IndexOutOfBoundsException: Index: 11
3.删除功能
//Object remove(int index):根据索引删除元素,返回被删除的元素
list.remove(1);
list.remove(11);//java.lang.IndexOutOfBoundsException: Index: 11
4.修改功能
//Object set(int index,Object element):根据索引修改元素,返回被修饰的元素
System.out.println("返回值:"+list.set(1, "javaee"));
三、List的特有集合遍历
1)利用size()和get()方法结合使用
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
2)利用List特有的迭代器遍历
/*
* 列表迭代器:
* ListIterator listIterator():List集合特有的迭代器
* 该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法。
*
* 特有功能:
* Object previous():获取上一个元素
* boolean hasPrevious():判断是否有元素
*
* 注意:ListIterator可以实现逆向遍历,但是必须先正向遍历,才能逆向遍历,所以一般无意义,不使用。
*/
// ListIterator listIterator()
ListIterator lit = list.listIterator(); // 子类对象
while (lit.hasPrevious()) {
String s = (String) lit.previous();
System.out.println(s);
}
System.out.println("-----------------");
// 迭代器
Iterator it = list.iterator();
while (it.hasNext()) {
String s = (String) it.next();
System.out.println(s);
}
3)关于迭代器并发修改异常的原因和解决方案
案例:
// 迭代器遍历
Iterator it = list.iterator();
while (it.hasNext()) {
String s = (String) it.next();
if ("world".equals(s)) {
list.add("javaee");
}
}
报错为:ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
产生原因:
迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。
其实这个问题描述的是:迭代器遍历元素的时候,通过集合是不能修改元素的。
解决方案:
A:迭代器遍历元素,迭代器修改元素(集合不能修改,但是迭代器可以)
// 而Iterator迭代器却没有添加功能,所以我们使用其子接口ListIterator
ListIterator lit = list.listIterator();
while (lit.hasNext()) {
String s = (String) lit.next();
if ("world".equals(s)) {
lit.add("javaee");
}
}
B:集合遍历元素,集合修改元素(普通for)
for (int x = 0; x < list.size(); x++) {
String s = (String) list.get(x);
if ("world".equals(s)) {
list.add("javaee");
}
}
总结:
A:迭代器迭代元素,迭代器修改元素
元素是跟在刚才迭代的元素后面的。
B:集合遍历元素,集合修改元素(普通for)
元素在最后添加的。
四、List的三个子类的特点(面试题)
ArrayList:
底层数据结构无是数组。查询快,增删快。
线程不安全,效率高。
Vector:
底层数据结构是数组。查询快,增删慢。
线程安全,效率低。又由于线程安全,导致查询也变慢。所以基本很少用。
LinkedList:
底层数据结构是链表。查询慢,增删快。
线程不安全,效率高。
小结:List的三个子类到底用谁呢?
要安全吗?
要:Vector(但是现在基本不用,有替代的)
不要:ArrayList或LinkedList
查询多:ArrayList
增删多:LinkedList
什么都不懂就用ArrayList。
那么重点掌握ArrayList。