Collection类之详解(二)
六、List集合
1.概述
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
List 接口提供了 4 种对列表元素进行定位(索引)访问方法。
List 接口提供了特殊的迭代器。
2.特有函数
void
add(int index, E element)
在列表的指定位置插入指定元素(可选操作)。
E
remove(int index)
移除列表中指定位置的元素(可选操作)。
E
get(int index)
返回列表中指定位置的元素。
E
set(int index, E element)
用指定元素替换列表中指定位置的元素(可选操作)。
3.案例
List list = new ArrayList();
list.add(111);
list.add(222);
list.add(333);
//list.add(10, "000"); //java.lang.IndexOutOfBoundsException越界异常
//Object obj = list.remove(1); //通过索引删除元素,将被删除的元素返回
//list.remove(111); //删除的时候不会自动装箱,把111当作索引,产生越界异常
//通过索引遍历List集合
for(int i = 0;i < list.size(); i++) {
System.out.println(list.get(i));
}
list.set(1, "444"); //将指定位置的元素修改
注:遍历时,如果需要使用子类方法,和Collection遍历一样需要向下转型
4.迭代器ListIterator
(1)概述
系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。
(2)案例
问题:
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("world");
list.add("c");
list.add("d");
list.add("e");
Iterator it = list.iterator(); //获取迭代器
while(it.hasNext()) { //判断集合中是否有元素
String str = (String)it.next(); //向下转型
//在遍历的同时修改集合内元素,产生并发异常ConcurrentModificationException
if("world".equals(str)) {
list.add("javaee");
}
}
解决:
ListIterator lit = list.listIterator(); //获取迭代器(List集合特有的)
while(lit.hasNext()) {
String str = (String)lit.next(); //向下转型
if("world".equals(str)) {
//此时同样产生并发修改ConcurrentModificationException
//list.add("javaee");
lit.add("javaee");
}
}
(3)常用方法
boolean
hasNext()
以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true)。boolean
hasPrevious()
如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。
E
next()
返回列表中的下一个元素。E
previous()
返回列表中的前一个元素。
案例:
public static void main(String[] args) {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
ListIterator lit = list.listIterator(); //获取迭代器
while(lit.hasNext()) {
System.out.print(lit.next()); //获取元素并将指针向后移动
}
System.out.println("\n-----------------");
while(lit.hasPrevious()) {
System.out.print(lit.previous()); //获取元素并将指针向前移动
}
}
/*
abcde
-----------------
edcba
*/
七、Vector类
1.概述
Vector
类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector
的大小可以根据需要增大或缩小,以适应创建 Vector
后进行添加或移除项的操作。
2.特有方法
void
addElement(E obj)
将指定的组件添加到此向量的末尾,将其大小增加 1。
E
elementAt(int index)
返回指定索引处的组件。
Enumeration<E>
elements()
返回此向量的组件的枚举。
3.案例
public static void main(String[] args) {
Vector v = new Vector();
v.addElement("a");
v.addElement("b");
v.addElement("c");
v.addElement("d");
Enumeration en = v.elements(); //获取枚举
while(en.hasMoreElements()) { //判断集合中是否有元素
System.out.println(en.nextElement()); //获取集合中的元素
}
}
注:Vector是JAVA早期版本中的类,目前大多数都使用ArrayList代替。
八、List的三个子类的特点
ArrayList:
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
Vector相对ArrayList查询慢(线程安全的)
Vector相对LinkedList增删慢(数组结构)
LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
Vector和ArrayList的区别:
Vector是线程安全的,效率低
ArrayList是线程不安全的,效率高
共同点:都是数组实现的
ArrayList和LinkedList的区别
ArrayList底层是数组结果,查询和修改快
LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
共同点:都是线程不安全的