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编程思想

原文地址:https://www.cnblogs.com/zyly/p/10647315.html