List集合
list集合有序、元素可重复。以元素的添加顺序作为集合的排列顺序,用下标索引集合中的元素。
list因为使用下标索引元素,所以元素可重复。set使用元素本身来索引,所以元素不能重复。
list的继承关系:
list继承了collection的所有方法,也有自身的一些方法(下标操作):
void add(int index,object element) 在指定处插入一个元素
boolean addall(int index,collection c) 在指定处插入c的所有元素
object get(int index) 获取指定位置处的元素
int indexof(object obj) 返回该对象在集合中第一次出现的位置
int lastindexof(object obj) 最后一次出现的位置
object remove(int index) 删除并返回指定位置的元素
object set(int index,object obj) 替换/设置指定位置的元素,并返回旧的元素
list sublist(int start,int end) 返回子list
listiterator listiterator() 返回list集合专用的迭代器
java8新增了sort()、replaceall()2个方法,可以自定义排序规则、匹配模板。
list接口常用的实现类:
1、arraylist、vector。
arraylist、vector都是基于数组实现的list接口,内部都封装了一个动态的、长度可变的数组。
向arraylist、vector集合中添加元素,如果数组长度不够,会自动调用 ensurecapacity() 重新设置数组长度,一般不用我们操心。
如果要向arraylist、vector添加大量元素,可以手动调用 ensurecapacity() 一次性增大数组长度,这样可以减少重新分配的次数,提高性能。
ensurecapacity(int mincapacity) //参数是数组的最小元素个数
vector有一个子类stack,用于模拟栈这种数据结构。
arraylist不是线程安全的,当多个线程同时访问、修改arraylist集合时,需要手动同步该集合。
vector是线程安全的,但这意味着vector有更大的开销,所以性能低于arraylist。
尽管vector是线程安全的,但vector的缺点太多了,尽量不要使用vector。
2、linkedlist
linkedlist不仅实现了list接口,还实现了queue接口的子接口deque。queue接口用于模拟队列这种数据结构。
linkedlist是基于链表实现list接口的,内部维护了一个链表,来实现有序。
性能分析:
queue集合、list集合是java中的线性表结构。queue很少使用。
arraylist、vector是基于数组的,linkedlist是基于链表的。
vector既要维护一个数组,又要保证线程安全,开销较大,性能最差,一般不用。
arraylist基于数组,查找元素较快,适合多查找的操作,但插入、删除需要移动大量数组元素。
linkedlist基于链表,适合经常插入、删除的操作,但查找效率不高。