1. 程式人生 > >Java基礎 -- Collection和Iterator接口的實現

Java基礎 -- Collection和Iterator接口的實現

接口實現 介紹 底層 理解 mov face bstr 編寫代碼 代碼

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

Java基礎 -- Collection和Iterator接口的實現