Java基礎 -- Collection和Iterator接口的實現
阿新 • • 發佈:2019-04-03
接口實現 介紹 底層 理解 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接口的實現