Java的List接口分析

注释说明

链表是有序集合(也叫做序列)。这个接口的使用者可以精确控制在list中,每个元素查在哪。用户可以通过它们的整型索引(在list中的位置)访问元素、搜索在list中的元素。

不像set,list一般允许重复怨怒是。还有,list一般允许e1和e2的元素对,例如e1.equals(e2),并且,如果它们允许空元素的话,可以允许重复的空元素。有些人希望实现禁止重复的链表,通过抛出运行时异常,当用户试图插入它们,但是我们希望这种使用是稀少的。

List接口附加额外条款,超越了在Collection接口的说明,比如在iterator\add\remove\equals和hashCode这些方法方面。为了方便,其他被集成的方法也被包含在这里。

List接口提供4个方法用于位置(索引)访问list元素。list(类似Java数组)是从0开始的。注意,对于一些实现,这些操作会执行相应的时间来索引值(比如LinkedList类)。因此,在list中迭代元素一般更倾向于索引,如果调用者不知道具体实现。

List接口提供一个特殊的迭代器,叫做ListIterator,它允许元素插入、替换和双向访问,这是对Iterator接口提供的普通操作的补充。一个从list中具体位置开始,获取list迭代器的方法。

List接口中提供两个方法去搜索具体元素。从性能的角度讲,这些方法应该小心使用。在许多实现中,它们会执行昂贵的线性搜索。

List接口提供两个方法在链表的任意位置高效的写入和移除多个元素。

注意:当链表允许包含它们自身为元素时,要额外的注意:equals和hashCode方法不再能很好的定义这个链表。

一些链表实现在它们可以包含什么元素有严格限制。例如,一些实现禁止空元素和有些在它们元素的类型上有限制。尝试去添加不合法的元素是抛出一个未受检异常,一般NullPointerException或者ClassCastException。尝试查询不合法元素的存在会抛出一个异常,或者它会简单的返回false;一些实现会展现前面的行为,一些会展现后面的行为。更通常的是,在不合法元素上的操作,就是它的完成不会导致不合法元素插入到链表中,可能抛出异常或者它可能成功,在实现的选项上。这种异常在这个接口的说明中被标记为可选的。

接口及其说明

  1. int size():返回这个链表中元素的数量。如果链表中包含超过Integer.MAX_VALUE个元素,返回Integer.MAX_VALUE。
  2. boolean isEmpty():如果这个链表不包含任何元素,返回true。
  3. boolean contains(Object o):如果这个链表包含指定元素就返回true。更正式点,当且仅当这个链表至少有一个元素o==null ? e==null : o.equals(e)。如果指定元素的类型不兼容这个链表,抛出ClassCastException。如果指定元素是null,并且这个链表不允许null元素,抛出NullPointerException。
  4. Iterator<E> iterator():返回这个链表中元素合适顺序的迭代器。
  5. Object[] toArray():返回包含在这个链表中所有元素的数组,以合适的序列(从第一个元素到最后一个元素)。被返回的数组回事安全的,在该数组中没有由这个链表维护的索引。(换句话说,这个方法必须分配一个新的数组,即时这个链表的背后是一个数组)。调用者因此可以自由的修改被返回的数组。这个方法扮演者在基于数组的和基于集合的API之间的桥梁。
  6. <T> T[] toArray(T[] a):返回一个包含这个链表中所有元素的数组,以合适的顺序(从第一个元素到最后一个元素);返回数组的运行时类型是指定的数组。如果该链表适应指定的数组,它在里面换回来了。否则,否则,一个新的数组就用给定的运行时类型和这个链表的大小分配。
  7. boolean add(E e):追加指定元素到这个链表的末尾。支持这个操作的链表可以附加什么元素可以被添加到这个链表中的限制。尤其是,一些链表会拒绝添加null元素,并且其他强制显示可以被添加的元素类型。链表类应该清晰的在它们的文档中说明被添加元素的限制。
  8. boolean remove(Object o):如果存在的话,移除这个链表中第一次遇到的指定元素。如果这个链表不包含该元素,它不会被改变。更正是点,移除有最低索引i的元素,例如o==null ? get(i) == null : o.equals(get(i)))(如果有这样的元素存在)。如果这个链表包含指定的元素(或者等价的),返回true。
  9. boolean contansAll(Collection<?> c):如果这个链表包含给定集合的所有元素,返回true。
  10. boolean addAll(Collection<? extends E> c):把给定集合中的所有元素追加到这个链表的末尾,按照它们从给定集合的迭代器中返回的顺序(可选操作)。如果给定的集合在该操作处理中被修改,该操作的行为是未定义的。注意:如果给定的集合是这个链表,并且它不是空的,这就会发生)。
  11. boolean addAll(int index, Collection<? extends E> c):把指定集合中的所有元素插入到这个链表的指定位置。
  12. boolean removeAll(Collection<?> c):从这个集合中移除所有包含在指定集合中的元素。求补集。
  13. boolean retainAll(Collection<?> c):只保留在这个链表中且包含在指定集合中的元素(可选操作)。换句话,从这个链表中移除所有不包含在给定集合中的元素。求交集。
  14. default void replaceAll(UnaryOperator<E> operator):用应用这个操作到那个元素的结果来替换这个链表中的每个元素。这个操作抛出的错误和运行时异常被转发给调用者。
  15. default void sort(Comparator<? super E> c):根据包含在具体Comparator中的顺序排序这个链表。
  16. void clea():从这个链表中移除所有的元素。这个链表会在这个调用返回后为空。
  17. boolean equals(Object o):用这个链表比较给定对象。当且仅当给定对象也是链表,且两个链表都有相同的大小,所有在这两个链表中的对应元素对是equal的,就返回true。
  18. int hashCode():返回这个链表的哈希码。链表的哈希码被定义为下main计算的结果。
  19. E get(int index):返回这个链表中指定位置的元素。
  20. E set(int index, E element):用给定的元素替换这个链表中指定位置的元素
  21. void add(int index, E element):在这个链表中的指定位置插入具体元素。转移在哪个位置的当前元素和任意后续元素到右边(添加一个到它们的指数)。
  22. E remove(int index):移除在这个链表中指定位置的元素。转移任何后续元素到左边。返回从链表中被删除的元素。
  23. int indexOf(Object o):返回在这个链表中第一次遇到指定元素的索引,不包含该元素就返回-1。
  24. int lastIndexOf(Object o): 返回在链表中最后一次遇到指定元素的索引,如果不包含给定元素就是-1.
  25. ListIterator<E> listIterator():返回在这个链表中的元素的链表迭代器(以合适的序列)。
  26. List<E> subList(int fromIndex, int toIndex):返回这个链表中在指定fromIndex(包含)和toIndex(不包含)之间的部分视图。(如果fromIndex与toIndex相等,返回的链表为空)。返回的链表由这个链表支持,所以,在这个返回的链表中的非结构话的改变被反射在这个链表中,反之亦然。返回的链表支持支持所有这个链表支持的操作。
  27. default Spliterator<E> spliterator():创建这个链表上元素的Spliterator。

List接口的主要实现类

ArrayList,LinkedList,SynchronizedList,UnmodifiableList,CopyOnWriteArrayList。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容