LinkedList类php
因为基于数组的链表有一个大的缺点,那就是从链表中间移除一个元素时须要将此元素后面的全部元素向前移动,会产生大量的开销,一样的在链表中间插入一个新元素也会有大量开销。以下图:css
Linkedlist因为其实现方式使用的是指针,或者说是引用,那么就不存在arraylist那种插入或者移除一个元素时的大开销状况了:html
固然,LinkedList与ArrayList都是保持元素顺序的,调用add的前后顺序决定了最终遍历的顺序:java
List<String> staff = new LinkedList<>(); staff.add("Amy"); staff.add("Bob"); staff.add("Carl"); ListIterator<String> iter = staff.listIterator(); iter.next(); // skip past first element iter.add("Juliet");
LinkedList与ArrayList提供listIterator方法,返回一个实现了ListIterator接口的对象,此接口提供了Iterator接口一些没有的功能,是为链表定制的遍历器:node
当屡次调用add方法后,元素会被按顺序加到当前遍历器位置以前:nginx
当刚刚调用完listIterator后没有调用next,直接调用add方法后,新加入的元素会插入到第一个位置,做为list的头结点;
当一直调用next方法,直到hasNext方法返回false,也就是到达list尾部时,在这是调用add方法将新加入的元素做为list的最后结点,即新的尾结点。
当list中存在n个元素时,那么就会有n+1个空位能够插入新的结点,以下面的list有A、B、C三个元素:git
|ABC A|BC AB|C ABC|
分别对应上面4个空位点能够插入新的元素。github
listIterator中还包含一个set方法,它会替换刚刚由next或者previous返回的元素,也就是遍历器刚刚通过的那个元素:web
ListIterator<String> iter = list.listIterator(); String oldValue = iter.next(); // returns first element iter.set(newValue); // sets first element to newValue
当有两个iterator同时在操做一个list的时候,就有可能产生冲突。好比一个iterator在删除元素,另外一个再读取元素。list自己能够检查到这种状况,若是有多于一个iterator在操做list,就会抛出ConcurrentModificationException异常。以下代码:ajax
List<String> list = . . .; ListIterator<String> iter1 = list.listIterator(); ListIterator<String> iter2 = list.listIterator(); iter1.next(); iter1.remove(); iter2.next(); // throws ConcurrentModificationException
LinkedList是不支持快速随机访问的,若是须要获取第n个元素,那么惟一的方法就是从LinkedList的第一个节点开始遍历,固然,这样很费时间,因此当须要相似获取第n个元素的操做时,不要使用LinkedList。
使用LinkedList的惟一缘由是其可以快速的进行插入与删除操做,而不损耗时间,若是你只有少许的元素进行存储,仍是选择arraylist吧。
建议远离LinkedList中使用integer index去获取和操做list的全部方法,若是须要随机访问集合,请使用arrayList。
List实现了两种访问方式,一种是经过iterator从头访问到尾, 一种是经过get和set方法直接访问list中的元素。linkedlist属于前者,arraylist属于后者。ArrayList内部封装了一个能够动态改变大小的数组。Vector与ArrayList的不一样在于Vector是线程安全的,多个线程同时操做时安全的。而ArrayList则不是。固然Vector为了维持多线程同步安全,牺牲了部分性能。