JavaSE进阶
11.4 List接口
- List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。
- List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
- JDK API中List接口的实现类常用的有:ArrayList、LinkedList和Vector。
11.4.1 List接口的方法
- List除了从Collection集合继承的方法外,List 集合里添加了一些根据索引来操作集合元素的方法
- void add(int index, Object ele)
- boolean addAll(int index, Collection eles)
- Object get(int index)
- int indexOf(Object obj)
- int lastIndexOf(Object obj)
- Object remove(int index)
- Object set(int index, Object ele)
- List subList(int fromIndex, int toIndex)
11.4.2 List接口的迭代器ListIterator
除了foreach和Iterator迭代器之外,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()
11.4.3 List的实现类
ArrayList:底层实现是数组,线程不安全,效率高,所以,查询块,修改、插入、删除慢
LinkedList:底层实现是链表,线程不安全,效率高。所以,查询慢,修改、插入、删除快
Vector:底层实现是数组,线程安全,效率低。但是即使为保证 List 集合线程安全,也不推荐使用Vector。
ArrayList的JDK1.8之前与之后的实现区别?
JDK1.7:ArrayList像饿汉式,直接创建一个初始容量为10的数组
JDK1.8:ArrayList像懒汉式,一开始创建一个长度为0的数组,当添加第一个元素时再创建一个始容量为10的数组
1、ArrayList与Vector的区别?
- 底层都是数组,Vector默认初始容量是10,ArrayList看版本.
- ArrayList扩容增加原来的50%,Vector扩容增加原来的1倍。
- ArrayList线程不安全,效率高,Vector线程安全,效率低。
- Vector因为版本古老,支持Enumeration 迭代器。但是该迭代器不支持快速失败。而Iterator和ListIterator迭代器支持快速失败。如果在迭代器创建后的任意时间从结构上修改了向量(通过迭代器自身的 remove 或 add 方法之外的任何其他方式),则迭代器将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就完全失败,而不是冒着在将来不确定的时间任意发生不确定行为的风险。
自学:Enumeration 迭代器的使用
2、LinkedList的特点
LinkedList:双向链表,除了保存数据,还定义了两个变量:
prev变量记录前一个元素的位置
next变量记录下一个元素的位置
例如:
对于频繁的插入或删除元素的操作,建议使用LinkedList类,效率较高。新增方法:
- void addFirst(Object obj)
- void addLast(Object obj)
- Object getFirst()
- Object getLast()
- Object removeFirst()
- Object removeLast()