List
List集合代表元素有序,可重复的集合,每个元素都有对应的顺序索引。通过索引来访问指定位置的集合元素,默认按元素的添加顺序设置元素的索引。
List接口是Collection接口的子接口,可以使用Collection接口里的全部方法,且List是有序集合,所以添加了一些根据索引操作集合元素的方法:
void add(int index,Object element):将元素element插入index位置
boolean addAll(int index,Collection c):将集合c所包含的所有元素插入index位置
Object get(int index):返回index位置的元素
int indexOf(Object o):返回元素o在集合中第一次出现的索引
int lastIndexOf(Object o)
Object remove(int index):删除并返回index处的元素
Object set(int index,Object o):将index处元素替换为o,返回被替换的元素
List subList(int from,int to):返回从索引from(包含)到to(不包含)处所有集合元素组成的子集合
java8新增的默认方法:
void replaceAll(UnaryOperator opreator):根据operator计算规则重新设置集合所有元素,可以替换为Lumbda
void sort(Comparator c):根据Comparator参数对集合进行排序,可以替换为Lumbda
可以使用for循环来遍历List
List判断对象相等通过调用参数的equals,所以两个String对象也可义相等
set方法的索引必须是有效索引,例如集合长度是4,则不能替换指定索引为4的元素,也就是set方法不会改变List集合长度
与Set只提供一个iterator()方法不同,List还提供了一个listIterator()方法,该方法返回一个listItreator对象,ListIterator接口继承了Iterator接口,提供专门操作List的方法:
boolean hasPrevious():返回该迭代器关联的集合是否还有上一个元素
Object previous():返回该迭代器上一个元素
void add(Object o):在指定位置插入o
listIterator增加向前迭代功能和添加元素功能,iterator只能向后迭代和删除元素。
listIterator开始也需要正向迭代,然后才反向迭代:
ListIterator lis = bookList.listIterator();
while(lis.hasNext()){...}
while(lis.hasPrevious()){...}
经典实现类:ArrayList和Vector,LinkedList
ArrayList和Vector类都是基于数组实现的List类,所以ArrayList和Vector类封装了一个动态的、允许再分配的Object[]数组,使用 initialCapacity参数来设置该数组的长度,当向ArrayList或Vector中添加元素超出该数组长度时,initialCapacity自动增加,通常无需关心initialCapacity。只有在向数组添加大量元素时,使用ensureCapacity(int minCapacity)方法一次性的增加initialCapacity来减少重分配次数,从而提高性能。
空的ArrayList和Vector不指定initialCapacity,则Object[]数组的默认长度为10
两个方法重新分配Object[]数组:
void ensureCapacity(int minCapacity):增加Object[]长度增加大于或等于minCapacity的值
void trimToSize():调整Object[]数组长度为当前元素个数。减少占用的存储空间
Vector很多缺点,太老,减少使用
区别:ArrayList是线程不安全的,Vector是线程安全的,但性能比ArryayList低。可以通过Collections工具类将一个ArrayList变成线程安全
Vector提供一个Stack子类,同样是线程安全性能较差的,且取出元素后必须进行类型转换,不推荐使用(可以使用ArrayDeque):
Object peek():返回栈的第一个元素,但并不出栈
Object pop():取
void push(Object item):存
固定长度的List:
操作数组的工具类Arrays提供了asList(Object... a)方法,可以把一个数组或者指定个数的对象转换成一个List集合,这个集合既不是ArrayList实现类的实例,也不是Vector实现类的实例,而是Arrays的内部类ArrayList的实例
Arrays.ArrayList是一个固定长度的List集合,程序只能遍历访问该集合里的元素,不可增加、删除该集合里的元素,否则报UnsupportedOperationException异常
LinkedList:基于链表,增删快
特有方法:addFirst(E e) addLast(E e) getFirst() getLast() removeFirst() remveFirstOccurrence(E e)从此列表中移除第一次出现的指定元素 removeLast()