List集合
java.util.List
接口继承自Collection
接口
List接口特点:
1、线性存储元素 2、存取有序 3、带有索引可以精确操作集合中的元素 4、可以有重复元素
List集合关心元素是否有序,而不关心是否重复
List接口中常用方法
List除了从Collection集合继承的方法外,增加了一些根据索引来操作集合元素的方法
1、 添加元素
- void add(int index, E ele)
- boolean addAll(int index, Collection<? extends E> eles)
2、获取元素
- E get(int index)
- List subList(int fromIndex, int toIndex)
3、获取元素索引
- int indexOf(Object obj)
- int lastIndexOf(Object obj)
4、删除和替换元素
- E remove(int index)
- E set(int index, E ele)
List集合的遍历方式
- Iterator迭代器
- 增强for循环
- 普通for循环
- ListIterator迭代器
List 集合额外提供了一个 listIterator() 方法,该方法返回一个 ListIterator 列表迭代器对象, ListIterator 接口继承了 Iterator 接口,提供了专门操作 List 的方法:- void add():通过迭代器添加元素到对应集合
- void set(Object obj):通过迭代器替换正迭代的元素
- void remove():通过迭代器删除刚迭代的元素
- boolean hasPrevious():如果以逆向遍历列表,往前是否还有元素。
- Object previous():返回列表中的前一个元素。
- int previousIndex():返回列表中的前一个元素的索引
- boolean hasNext():判断是否有下一个元素
- Object next():获取下一个元素
- int nextIndex():返回元素的索引
使用方式: ListIterator listIterator = list.listIterator();
List接口的实现类
1、 ArrayList实现类
比较Vector类底层也使用数组,但是线程安全,效率低,不推荐使用。
ArrayList底层实现:可变长的数组,有索引,查询效率高,增删效率低
构造方法:
new ArrayList():
jdk6中,空参构造直接创建10长度的数组。
jdk7(新版)、jdk8中,默认初始容量0,在添加第一元素时初始化容量为10
new ArrayList(int initialCapacity):
指定初始化容量
添加元素:add(E e);
首次添加元素,初始化容量为10
每次添加修改modCount属性值
每次添加检查容量是否足够,容量不足时需要扩容,扩容大小为原容量的1.5倍
移除元素:remove(E e);
每次成功移除元素,修改modCount值
每次成功移除需要移动元素,以保证所有元素是连续存储的(删除操作效率低的原因)
------------------------------
Vector实现类的不足:
初始容量为10,容量不足时扩容,如果capacityIncrement为0 扩容增加为原来的2倍,否则容量为旧的长度+capacityIncrement。
2、LinkedList实现类
LinkedList底层存储数据使用链表结构(双向链表),特点:首尾增删快,其他地方需要先查询到再增删,查询慢。
LinkedList底层结构:
LinkedList新增了操作首尾元素的方法(首、尾元素的操作效率高):
- void addFirst(Object obj )
- void addLast(Object obj )
- Object getFirst()
- Object getLast()
- Object removeFirst()
- Object removeLast ()
ArrayList添加元素时底层源码
第一次添加数据:
第十一次添加元素时: