Java中的Collection

Collection简介

在类库中,Java语言包含有对一些普通数据结构的实现。该语言的一部分通常叫作Collection API。Collection API位于java.util包中。Collection实现了Iterable接口。实现了Iterable接口的类可以使用增强的for循环。

Iterator接口的简介

实现了Iterator接口的集合必须提供一个称为iterator的方法,该方法返回一个Iterator类型的对象。该Iterator接口是一个在java.util包中定义的接口:

public interface Iterator<AnyType>
{
	boolean hasNext();
	AnyType next();
	void remove();
}

Iterator接口的remove方法可以删除由next最新返回的项。相比于Collection中的remove方法主要优点在于:
Collection中的remove方法必须先找出删除的项,如果知道项的准确位置则删除的开销就小很多,迭代器的remove则更高效。

举个例子:
编写一个程序删除偶数项的值
我们用集合中的remove方法
这个方法存在的问题:
第一:如果我们采用ArrayList来实现List接口,那么我们在进行remove方法的时候效率不会很高
第二:如果我们用LinkedList来实现List接口,那么在进行查询的时候效率会比较低。而且对remove的调用同样低效,因为达到位置i的代价是昂贵的。

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

还有一种思路是:用迭代器循环,并调用Collection中的remove方法。这种方法对remove的调用同样是低效的因为remove方法会重新对要删除的项进行搜索。另外,如果使用迭代器并在增强的for循环里使用remove的删除方法,会报ConcurrentModificationException异常,因为这改变了结合的结构。

另外一个思路,在迭代器找到一个偶数项时,我们调用迭代器的remove方法进行删除,这样remove就不需要查找要删除的项。因此,对于LinkdeList整个程序花费线性时间,而不是二次时间。对于ArrayList,即使迭代器位于需要删除的节点上,其remove方法任然是昂贵的,因为数组的项必须要移动,仍然花费的是二次时间。

public static void removeEvenVer3(List<Integer> list)
{
	Iterator <Integer> itr=list.iterator();
	while(it.haNext())
	{
		if(itr.next()%2==0){
			itr.remove();
		}	
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值