Java集合(二)—— List详解
List接口
List接口的元素是有序、可重复的
一、Vector
public class Vector<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, Serializable
Vector实现了RandomAccess接口,因此可以通过下标进行随机访问,底层数据结构是数组结构。 Vector中的方法由于加了 synchronized 修饰,所以Vector的操作是线程安全的。 Vector实现了Cloneable,重载了clone()方法,因此可以进行克隆。 Vector实现了Serializable接口,因此可以进行序列化。
1、扩容机制
Vector默认初始容量为10(jdk7和jdk8一样都初始容量为10),加载因子为1(即当元素个数超过容量长度时,才进行扩容)。 扩容机制:扩展大小为原容量的 1倍,扩展后新容量为原容量的2倍。
如: Vector的容量为10,一次扩容后是容量为20
2、遍历方式
2.1、通过迭代器遍历
Iterator it=vector.iterator(); while(it.hasNext()){ Systrm.out.println(it.next()); }
2.2、for循环遍历
for(int i=0;i<vector.size();i++){ Systrm.out.println(vector.get(i)); }
或者使用增强for循环遍历
for( String value: vector){ Systrm.out.println(value); }
2.3、通过Enumeration遍历
Integer value=null; Enumeration enu=vector.elements(); while(enu.hasMoreElements()){ value=(Integer)enu.nextElement(); }
二、ArrayList
public class ArrayList<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, Serializable
ArrayList 继承自 AbstractList,实现了 List 接口。允许 null 的存在。同时还实现了 RandomAccess、Cloneable、Serializable 接口,所以ArrayList 是支持快速访问、复制、序列化的。 ArrayList是线程不安全的,查询速度快。 底层数据结构是数组结构。
1、扩容机制
ArrayList 默认初始容量为10,(jdk8的时候底层Object[] elementData数组初始化为{},并没有创建长度为10的数组。在add元素时才创建了10个容量。) 扩容增量:扩容大小是原容量的 0.5倍,扩容后的新容量为原容量的1.5倍。
如:ArrayList的容量为10,一次扩容后是容量为15
2、方法
remove()方法
使用remove方法最好使用迭代器辅助进行
while (iterator.hasNext()) { Student student = iterator.next(); //一定要先iterator.next(),否则直接remove会报错 iterator.remove(); }
三、LinkedList
public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, Serializable
LinkedList 的底层是由双向链表(也叫双链表)实现的,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。 LinkedList是线程不安全的,它的插入删除操作较快。
下一篇:
每天一道算法题——变态跳台阶