Collection是描述所有序列容器(集合)共性的根接口,它可能被认为是一个“附属接口”,即因为要表示其他若干个接口的共性而出现的接口。另外,java.util.AbstractCollection抽象类实现了Collection的默认实现,使得我们可以创建AbstractCollection的子类型。
使用接口描述的一个理由是它可以使我们能够创建更通用的代码。通过针对接口而非具体实现来编写代码,我们的代码可以应用于更多的对象类型。如果编写的方法将接受一个Collection,那么该方法就可以应用于任何实现了Collection的类。
import java.util.*;
public class InterfaceVsIterator {
public static void display(Iterator<Integer> it) {
while(it.hasNext()) {
int num = it.next();
System.out.print(num + " ");
}
System.out.println();
}
public static void display(Collection<Integer> nums) {
for(int num : nums){
System.out.print(num + " ");
}
System.out.println();
}
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 1,2,3,4,5,6,7);
display(list);
display(list.iterator());
}
}
输出:
1 2 3 4 5 6 7
1 2 3 4 5 6 7
从上面例子可以看到,Collection接口和Iterator都可以将display()方法与容器底层实现解耦。
在foreach结构中可以遍历Collection,主要是因为Collection接口实现了Iterable接口,这在Java基础 -- 深入理解迭代器中介绍过。
一 实现Collection接口
如果我们想创建一个Collection接口的实现应该怎么办,那么我们必须实现所有Collection方法。但是我们可以通过继承AbstractCollection,就可以简单实现它,这样,我们只需要提供iterator()和size()方法即可:
import java.util.*;
public class CollectionSequence<T> extends AbstractCollection<T>{
private List<T> ints = new ArrayList<T>();
@Override
public Iterator<T> iterator() {
// TODO Auto-generated method stub
return new Iterator<T>() {
public int index = 0;
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
return index < ints.size();
}
@Override
public T next() {
// TODO Auto-generated method stub
return ints.get(index++);
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
@Override
public boolean add(T e) {
// TODO Auto-generated method stub
return ints.add(e);
}
@Override
public int size() {
// TODO Auto-generated method stub
return ints.size();
}
public static void main(String[] args) {
CollectionSequence<Integer> c = new CollectionSequence<Integer>();
Collections.addAll(c, 3,4,3,4,5,6,7);
InterfaceVsIterator.display(c);
c.add(2000);
InterfaceVsIterator.display(c.iterator());
}
}
输出:
3 4 3 4 5 6 7
3 4 3 4 5 6 7 2000
从上面例子可以看到,实现Collection,只需要实现iterator()、size()方法,这是由于继承了AbstractCollection类,所以花费的代价很小。但是,如果你的类已经继承了其他的类,那么就不能再继承AbstractCollection类了。在这种情况下,要实现Collection,就必须实现该接口的所有方法,
参考文献:
[1]java编程思想