(注意:本文基于JDK1.8)
前言
任何一個容器類對象用于持有元素后,總是需要遍歷元素的,即挨個去訪問每個元素1次,而遍歷元素,除了常規的依賴于數組對象的下標之外,更常用的是封裝好的迭代器,今天就來學習Vector中的迭代器是如何設計的,與迭代器相關的方法有:
iterator()
listIterator()
listIterator(int index)
3個Vector中的定義的方法,均會返回一個迭代器對象……簡單說說這3個方法的來歷
iterator()方法的來歷
iterator()方法,是Vector實現的Iterable接口規范的方法,如何你直觀的去看Vector的類結構,你并找不到Iterable接口的定義,你看到的應該是這樣的:
1
2
3
4
5
6
|
public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { …………省略代碼………… } |
那么Iterable接口在哪里呢?沒錯,就在List接口中,List接口繼承了Collection接口,而Collection接口則又繼承了Iterable接口,因為Vector實現了List接口,所以間接獲得iterator()方法的實現需求。
List接口表示具備線性表的能力、Collection接口表示具備集合的能力,而Iterable接口則表示具備可遍歷的能力
List擴展了Collection的能力,而Collection又擴展了Iterable的能力,List的能力最大,且也符合這樣的規范,既然作為線性表,當然應該具備Collection中的定義的能力,而既然作為集合,應該具備可遍歷元素的能力。
listIterator()與listIterator(int)方法的來歷
這兩個方法,則來源于Vector的父類AbstractList中的定義,只不過Vector均對其進行了重寫,而AbstractList則是根據自己實現的List接口,而實現的這兩個方法。話不多少,接下來看看
iterator()方法分析
1
2
3
|
public synchronized Iterator<E> iterator() { return new Itr(); } |
用于返回一個迭代器對象的方法,synchronized修飾,只有獲取到對象的鎖的線程才能執行該方法
1、創建Itr對象
Itr是定義在Vector中的普通內部類,它產生的對象用于表示迭代器,也稱為迭代器對象
2、向調用者返回迭代器對象
listIterator()方法分析
1
2
3
|
public synchronized ListIterator<E> listIterator() { return new ListItr( 0 ); } |
用于返回一個迭代器對象的方法,此迭代器用于從第一個元素開始遍歷
1、創建ListItr對象
ListItr也為Vecor中的定義的一個普通內部類,它的構造方法可以傳入的一個參數,表示起始下標(從哪個元素開始)
2、向調用者返回ListItr對象
listIterator(int)方法分析
1
2
3
4
5
|
public synchronized ListIterator<E> listIterator( int index) { if (index < 0 || index > elementCount) throw new IndexOutOfBoundsException( "Index: " +index); return new ListItr(index); } |
用于返回一個迭代器對象,傳入的參數表示此迭代器可以從哪個元素開始
1、檢查傳入的下標是否合理
當傳入下標小于0、或者傳入的下標大于elementCount(即表示元素總數、又表示即將添加新元素的下標),則證明不合理,此處會拋出IndexOutOfBoundsException()對象
2、創建ListItr對象
利用傳入的下標,將其傳入到ListItr的構造方法中,創建一個指定從某個下標處開始的迭代器對象
3、返回迭代器對象ListItr
總結
迭代器操作,全部依賴Itr類、以及ListItr類產生的對象,真真的迭代器對象就是它們,所以下一篇將直接分析,Itr類與ListItr類的所有方法
以上就是基于java構造方法Vector遍歷元素源碼分析的詳細內容,更多關于java構造方法Vector的資料請關注服務器之家其它相關文章!
原文鏈接:https://blog.csdn.net/cadi2011/article/details/116809430