Collection API
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();
}
}
}