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是线程不安全的,它的插入删除操作较快。
经验分享 程序员 微信小程序 职场和发展