List接口及其主要实现类

List接口继承和扩展了Collection接口,List接口表示具有顺序的集合,其中可以包含重复元素。使用此接口的实现类时,可以对列表中每个元素的插入位置进行精确的控制,用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。List接口中声明的常用方法如表1所示

表1 List接口中声明的常用方法
方法声明 方法功能
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类中的常用方法

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常用方法如下表所示

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类,对应数据结构中以“后进先出”方式存储和操作数据的线性表,即对象栈。

Stack类中常用的方法
方法声明 方法功能
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

猜你喜欢

转载自blog.csdn.net/SongBai1997/article/details/83042238