List
List接口在Collection的基础上添加了大量的方法,使得可以在List的中间插入和移除元素。
有两种List:(1)基本的ArrayList,在随机访问元素快,但是在List中间插入和移除元素较慢。(2)LinkedList,代价较低地在List中间进行插入和移除操作,优化了顺序访问。LinkedList在随机访问方面比较慢,但是特性集较ArrayList更大。
Method
Type | Method | Significance |
---|---|---|
boolean | add(e) | 在list尾部添加指定元素 返回是否成功 |
void | add(int ,e) | 指定位置添加元素 |
boolean | addAll([int index],Collection<? extends E> c) | 添加指定集合的所有元素到List指定位置 默认是尾部 |
void | clear() | 清除所有元素 |
boolean | contains(Object o) | 是否包含这个元素 |
boolean | containsAll(Collection<?> c) | 判断list是否包含指定集合的所有元素 |
boolean | equals(Object o) | 比较指定对象和这个list是否相等 |
E | get(int index) | 得到指定位置元素 |
int | indexOf(Object o) | 返回元素第一次出现的index -1表示未出现 |
boolean | isEmpty() | 返回list是否为空 |
Iterator < E> | iterator() | 返会List元素迭代器 |
int | lastIndexOf(Object o) | 从后往前返回元素第一次出现的index |
ListIterator < E> | listIterator([int index] | 返回list迭代器 可以指定位置开始 |
E | remove(int index) | 移除指定位置元素 |
boolean | remove(Object o) | 移除list第一次出现的指定元素 |
boolean | removeAll(Collection<?> c) | 移除指定collection和list所有共有的元素 |
boolean | retainAll(Collection<?> c) | 只保留指定collection和list所有共有的元素 |
E | set(int index, E element) | 用指定元素替换list指定位置的元素 |
int | size() | 返回list中元素个数 |
List< E> | subList(int fromIndex, int toIndex) | 返回子list |
Object[] | toArray() | 转换为数组 |
ArrayList
- ArrayList是List接口的非同步实现,底层使用数组保存所有元素,其操作基本上是对数组的操作。
- ArrayList可以理解为动态数组(容量能动态增长),该容量是指用来存储列表元素的数组的大小,随着向ArrayList中不断添加元素,其容量也自动增长
- ArrayList是有序的,允许包括null在内的所有元素
LinkedList
- LinkedList基于链表的List接口的非同步实现
- LinkedList链表有一系列表项连接而成,一个表项总是包含3个部分:元素内容,前驱表和后驱表。
- 无论LikedList是否为空,链表内部都有一个header表项,它既表示链表的开始,也表示链表的结尾。表项header的后驱表项便是链表中第一个元素,表项header的前驱表项便是链表中最后一个元素。
- LinkedList是有序的集合,LinkedList允许包括null在内的所有元素
- LinkedList是fail-fast的
Method
ArrayList和LinkedList都实现了List接口 所以拥有List的方法 但是LinkedList还有些独有的
Type | Method | Significance |
---|---|---|
void | addFirst(E e) | 在list头部插入指定元素 |
void | addLast(E e) | 在list尾部插入指定元素 |
Iterator | descendingIterator() | 返回双端队列元素的迭代器 按逆序 |
E | element()/peek() | 返回 但是并没有移除,list中的第一个元素 |
E | getFirst() | 返回list中第一个元素 |
E | getLast() | 返回list中最后一个元素 |
boolean | offer(E e) | 添加指定元素到list尾部 |
E | peekLast() | 返回 但是并没有移除,list中的最后一个元素 list空的时候返回null |
E | pollFirst() | 返回 并移除,list中的第一个元素 list空的时候返回null |
E | pollLast() | 返回 并移除,list中的最后一个元素 list空的时候返回null |
E | pop() | 弹出一个元素从表示list的stack中 |
void | push(E e) | 压入一个元素从表示list的stack中 |
E | removeFirst() | 移除并返回list中第一个元素 |
E | removeLast() | 移除并返回list中最后一个元素 |
boolean | removeLastOccurrence(Object o) | 移除list中最后一次出现的指定元素 |
Difference
- 底层实现:LinkedList底层是双向链表 ;ArrayList底层是可变数组
- 随机访问:LinkedList随机访问效率低 ;ArrayList随机访问效率高,因为LinkedList需要移动指针
- 插入删除:LinkedList插入和删除效率快 ;ArrayList插入和删除效率低,因为ArrayList要移动数据
Arrays.asList() (20.4.14)
- 该方法是将数组转化成List集合的方法。
例如:List<String> list = Arrays.asList("a","b","c");
但是 需要注意的是List<String> list = Arrays.asList(temp);
temp是个string数组 这样可以
List<Integer> list = Arrays.asList(temp);
temp是个int数组 这样不行 - 该方法适用于对象型数据的数组(String、Integer…)
- 该方法不建议使用于基本数据类型的数组(byte,short,int,long,float,double,boolean)
- 该方法将数组与List列表链接起来:当更新其一个时,另一个自动更新
- 返回的list不支持add()、remove()、clear()等方法。因为这个ArrayList不是java.util包下的,而是java.util.Arrays.ArrayList。它是Arrays类自己定义的一个静态内部类,这个内部类没有实现add()、remove()方法,而是直接使用它的父类AbstractList的相应方法。而AbstractList中的add()和remove()是直接抛出java.lang.UnsupportedOperationException异常。