Java基础 -- Collection和Iterator接口的实现
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编程思想