List接口、ArrayList类和LinkedList类 笔记

来源:互联网 发布:苹果免费打电话软件 编辑:程序博客网 时间:2024/06/05 20:30

List接口继承了Collection接口,它包含了Collection接口的所有方法,外加其他一些方法:

public interface List<AnyType> extends Collection<AnyType> {AnyType get(int index);AnyType set(int index, AnyType newVal);void add(int index, AnyType x);void remove(int index);ListIterator<AnyType> listIterator(int pos);}
ArrayList类提供了List ADT的一种可增长数组的实现。LinkedList类则提供了List ADT的双链表实现。


remove方法对LinkedList类的使用:

public static void removeEvensVer1(List<Integer> list) {int i = 0;while(i < list.size()) {if(list.get(i) % 2 == 0) {list.remove(i);} else {i++;}}}

LinkedList对get调用的效率不高,而且,对remove的调用同样低效,因为达到位置i的代价是昂贵的。

小tips:

在增强的for循环中也就是利用iterator进行迭代时,是不能对正在被迭代的集合上进行结构上的改变(即对该集合使用add、remove或clear方法),否则迭代器就不再合法(抛出ConcurrentModificationException异常)。只有在需要立即使用一个迭代器的时候,才获取迭代器。然而,如果迭代器调用了自己的remove方法,那么这个迭代器就仍然是合法的。


public static void removeEvensVer3(List<Integer> list) {Iterator<Integer> iterator = list.iterator();while(iterator.hasNext()) {if(iterator.next() % 2 == 0) {iterator.remove();}}}
上面指出一种成功的想法。对于一个LinkedList,对该迭代器的remove方法的调用只花费常数时间。因此,对于LinkedList,整个程序花费线性时间。对于一个ArrayList,即使迭代器位于需要被删除的节点上,其remove方法仍然是昂贵的,因为数组的项必须要移动,整个程序仍然花费二次时间。


关于ListIterator接口:

ListIterator扩展了Iterator的功能:

public interface ListIterator<AnyType> extends Iterator<AnyType> {boolean hasPrevious();AnyType previous();void add(AnyType x);void set(AnyType newVal);}


0 0
原创粉丝点击