1、List接口概述:有序的Collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确控制,用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
与set不同,列表通常允许重复的元素
包括ArrayList、Vector、LinkedList。
2、List集合的特有功能:
(1) 添加功能
void add(int index , Object obj) : 在指定位置添加元素
(2)获取功能
Object get(int index) : 获取指定位置的元素
Iterator next() : 当前迭代的迭代器,实际数据是集合的一个元素,通常使用强制类型转换成集合元素来使用。
(3)列表迭代
ListIterator listIterator() : List集合特有的迭代器,改迭代器继承了Iterator迭代器,因此可以直接使用hasNext()方法,但是ListIterator 具有一些特有的方法,例如实现逆向遍历,方法有:
Object previous():获取前一个元素
boolean hasPrevious() : 判断是否存在前一个元素
注意:使用逆序遍历之前必须先正向遍历,所以一般不使用。
void add(Object element) : 通过迭代器添加元素,添加位置是迭代器所在位置的后面。
(4)删除功能
Object remove(int index) : 根据索引删除元素,返回被删除的元素
(5)修改功能
Object set(int index , Object element) : 根据索引修改元素,返回被修改的元素
注意:List集合特有的遍历功能:size()和get()方法结合使用
for(int i = 0 ; i < list.size() ; i++)
System.out.println( list.get(i) ) ;
注意:当通过迭代器遍历集合时,如果需要对集合做更改(插入、删除等),会出现并发修改异常的错误,原因是迭代器是依赖集合存在的,集合发生了改变但是迭代器没有发生改变的话就会出现并发修改异常。也就是说当实用迭代器遍历元素的时候,通过集合不能修改元素。
解决方法:
<1>通过迭代器迭代元素,迭代器修改元素,此时新插入的元素的位置是在当前迭代器指向的位置的后面。
//例如:
Iterator it = list.iterator() ;
while(it.hasNext()){
//Object object = (Object)it.next() ;
if(XXX){
it.add(object) ; //it.set(object) ;
}
}
<2>通过集合遍历元素,集合修改元素(普通for循环)
// 例如:
for(int i = 0 ; i < list.size() ; i++){
if(XXX){
list.add(object) ;
}
}
举例:
public class ForTest {
public static void main(String[] args) throws SAXException, JAXBException {
Person p1 = new Person("a") ;
Person p2 = new Person("b") ;
Person p3 = new Person("c") ;
ArrayList<Person> persons = new ArrayList<>();
persons.add(p1);
persons.add(p2);
persons.add(p3);
Iterator<Person> iterator = persons.listIterator();
while (iterator.hasNext()) {
Person p = (Person) iterator.next();
if (p.getName().equals("b")) {
iterator.remove();
}
}
for(int i = 0 ; i < persons.size() ; i++){
System.out.println(persons.get(i).getName());
}
}
}
3、List的3个子类的特点:
ArrayList:
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高
Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低
LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高
LinkedList的特有功能
<1>添加功能
public void addFirst(Object e) : 在最前面添加元素
public void addLast(Object e) : 在最后面添加元素
<2>获取功能:
public Object getFirst() : 获取第一个元素
public Object getLast() : 获取最后一个元素
<3>删除功能
public Object removeFirst() : 移除第一个元素
public Object removeLast() : 移除最后一个元素
问题:3个子类什么时候用哪个?
分情况。
是否需要安全性?
要:Vector(即使是要安全,目前也不用了)
不要:ArrayList或者LinkedList
查询多:ArrayList
增删多:LinkedList