List接口继承和扩展了Collection接口,List接口表示具有顺序的集合,其中可以包含重复元素。使用此接口的实现类时,可以对列表中每个元素的插入位置进行精确的控制,用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。List接口中声明的常用方法如表1所示
方法声明 | 方法功能 |
void add(int index,Object element) | 在列表的index位置添加元素 |
Object remove(int index) | 删除列表中index位置的元素 |
Object get(int index) | 返回列表index位置的元素 |
Object set(int index,Object element) | 用指定元素替换列表中指定位置的元素 |
int indexOf(Object o) | 返回列表中首次出现指定元素的索引,如果列表中不包含此元素,则返回-1 |
int lastIndexOf(Object o) | 返回列表中最后出现指定元素的索引,如果列表中不包含此元素,则返回-1 |
List接口的实现类主要有ArrayList、Stack、Vector和LinkedList。
1、ArrayList类
ArrayList类以数组为数据结构实现了List接口,用于表述长度可变的数组列表。在ArrayList中使用对象数组保存数据,调用new ArrayList()后,它会默认初始化一个size=10的数组。每次add操作都要检查数组容量,如果不够,重新设置一个初始容量为1.5倍大小的新数组,然后再把每个元素复制过去。在数组中间插入或删除,都要移动后面的所有元素。
ArrayList实际上是一种容器(Collection),其中可以保存任意数量的元素,每个元素都是一个对象。声明和创建ArrayList对象时,还需要指定元素的类型,例如
ArrayList<String> notes=new ArrayList<String>();
ArrayList类中的常用方法
方法声明 | 方法功能 |
public boolean add(E o) | 向ArrayList容器中添加元素 |
public int size() | 获得ArrayList容器中元素的个数 |
public E get(int index) | 返回index位置的元素 |
public E remove(int index) | 删除index位置的元素 |
2、Vector向量
Vector类也实现了List接口,也用于表述长度可变的对象数组表列。与ArrayList的差别是:Vector是同步(线程安全)的,运行效率低,主要用于在线程环境中;而ArrayList是不同步的,适合在单线程环境中使用。除了实现了List接口中定义的方法外,Vector常用方法如下表所示
方法声明 | 方法功能 |
public Vector() | 构造一个空向量,使其内部数据数组的大小为10,其标准容量增量为零 |
public E elementAt(int index) | 返回index位置的元素 |
public void addElement(E obj) | 在向量末尾添加元素 |
public void removeElementAt(int index) | 移除index位置的元素 |
public void insertElementAt(E obj,int index) | 将指定元素插入到指定位置 |
public boolean removeElement(Object obj) | 从此向量中移除第一个匹配项 |
public void remove AllElements() | 从此向量中移除全部元素,并将其大小设置为零 |
public Object[] toArray() | 返回一个数组,包含此向量中以正确顺序存放的所有元素 |
3、Stack堆栈
堆栈是一种“后进先出”的数据结构,只能在一端进行输入或输出数据的操作。java.util.Stack类继承了Vector类,对应数据结构中以“后进先出”方式存储和操作数据的线性表,即对象栈。
方法声明 | 方法功能 |
pubic Stack() | 创建一个空Stack |
pubic Object push(E item) | 把项压入栈顶 |
public Object pop() | 移除栈顶元素 |
public Object peek() | 查看栈顶元素 |
public boolean empty() | 判断栈是否为空 |
public int search(Object o) | 返回对象在栈中的位置,以1为基数 |
4、LinkedList队列
LinkedList实现的是一个双向链表。每个节点除含有元素外,还包含向前、向后的指针。在链表结构中,每个元素都拥有两个指针属性,一个是指向上一个元素的previous指针,一个是指向下一个元素的next指针,第一个元素的previous指针指向“空”,最后一个元素的next指针指向“空”。增加结点,只会对链表的指针进行操作,速度快。LinkedList有双向队列的特征,在链表两端可增删数据。使用index查找对象时,会以index和size/2比较,从前或从后向中间搜索。
比较ArrayList和LinkedList的结构,可以得到以下结论。
ArrayList的remove和add(index,Object)操作代价高,需要移动后面的每个元素。
LinkedList采用链表数据结构实现,便于元素的插入和删除,它的get(index)操作代价高,要先循环遍历list找到Object