List接口、ArrayList类和LinkedList类 笔记

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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值