您的位置:首页 > 其它

List接口、ArrayList类和LinkedList类 笔记

2015-12-25 14:05 288 查看
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: