程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java聚集Iterator迭代的完成辦法

Java聚集Iterator迭代的完成辦法

編輯:關於JAVA

Java聚集Iterator迭代的完成辦法。本站提示廣大學習愛好者:(Java聚集Iterator迭代的完成辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是Java聚集Iterator迭代的完成辦法正文


我們經常應用 JDK 供給的迭代接口停止 Java 聚集的迭代。

Iterator iterator = list.iterator();
while(iterator.hasNext()){
String string = iterator.next();
//do something
}

迭代其實我們可以簡略地輿解為遍歷,是一個尺度化遍歷各類容器外面的一切對象的辦法類,它是一個很典范的設計形式。Iterator 形式是用於遍歷聚集類的尺度拜訪辦法。它可以把拜訪邏輯從分歧類型的聚集類中籠統出來,從而防止向客戶端裸露聚集的外部構造。 在沒有迭代器時我們都是這麼停止處置的。以下:

關於數組我們是應用下標來停止處置的:

int[] arrays = new int[10];
for(int i = 0 ; i < arrays.length ; i++){
int a = arrays[i];
//do something
}

關於 ArrayList 是這麼處置的:

List<String> list = new ArrayList<String>();
for(int i = 0 ; i < list.size() ; i++){
String string = list.get(i);
//do something
}

關於這兩種方法,我們老是都事前曉得聚集的外部構造,拜訪代碼和聚集自己是慎密耦合的,沒法將拜訪邏輯從聚集類和客戶端代碼平分離出來。同時每種聚集對應一種遍歷辦法,客戶端代碼沒法復用。 在現實運用中若何須要將下面將兩個聚集停止整合是相當費事的。所認為懂得決以上成績, Iterator 形式騰空降生,它老是用統一種邏輯來遍歷聚集。使得客戶端本身不須要來保護聚集的外部構造,一切的外部狀況都由 Iterator 來保護。客戶端從不直接和聚集類打交道,它老是掌握 Iterator,向它發送”向前”,”向後”,”取以後元素”的敕令,便可以直接遍歷全部聚集。

下面只是對 Iterator 形式停止簡略的解釋,上面我們看看 Java 中 Iterator 接口,看他是若何來停止完成的。

1、java.util.Iterator

在 Java 中 Iterator 為一個接口,它只供給了迭代了根本規矩,在 JDK 中他是如許界說的:對 collection 停止迭代的迭代器。迭代器代替了 Java Collections Framework 中的 Enumeration。迭代器與列舉有兩點分歧:

1、迭代器許可挪用者應用界說優越的語義在迭代時代從迭代器所指向的 collection 移除元素。

2、辦法稱號獲得了改良。

其接口界說以下:

public interface Iterator {
  boolean hasNext();
  Object next();
  void remove();
}

個中:

Object next():前往迭代器剛超出的元素的援用,前往值是 Object,須要強迫轉換成本身須要的類型

boolean hasNext():斷定容器內能否還有可供拜訪的元素

void remove():刪除迭代器剛超出的元素

關於我們而言,我們只普通只需應用 next()、hasNext() 兩個辦法便可完成迭代。以下:

for(Iterator it = c.iterator(); it.hasNext(); ) {
  Object o = it.next();
   //do something
}

後面論述了 Iterator 有一個很年夜的長處,就是我們不用曉得聚集的外部成果,聚集的外部構造、狀況由 Iterator 來保持,經由過程同一的辦法 hasNext()、next() 來斷定、獲得下一個元素,至於詳細的外部完成我們就不消關懷了。然則作為一個及格的法式員我們異常有需要來弄清晰 Iterator 的完成。上面就 ArrayList 的源碼停止剖析剖析。

2、各個聚集的 Iterator 的完成

上面就 ArrayList 的 Iterator 完成來剖析,其實假如我們懂得了 ArrayList、Hashset、TreeSet 的數據構造,外部完成,關於他們是若何完成 Iterator 也會胸中有數的。由於 ArrayList 的外部完成采取數組,所以我們只須要記載響應地位的索引便可,其辦法的完成比擬簡略。

2.1、ArrayList 的 Iterator 完成

在 ArrayList 外部起首是界說一個外部類 Itr,該外部類完成 Iterator 接口,以下:

private class Itr implements Iterator<E> {
//do something
}

而 ArrayList 的 iterator() 辦法完成:

public Iterator<E> iterator() {
return new Itr();
}

所以經由過程應用 ArrayList.iterator() 辦法前往的是 Itr() 外部類,所以如今我們須要關懷的就是 Itr() 外部類的完成:

在 Itr 外部界說了三個 int 型的變量:cursor、lastRet、expectedModCount。個中 cursor 表現下一個元素的索引地位,lastRet 表現上一個元素的索引地位

int cursor; 
int lastRet = -1; 
int expectedModCount = modCount;

從 cursor、lastRet 界說可以看出,lastRet 一向比 cursor 少一所以 hasNext() 完成辦法異常簡略,只須要斷定 cursor 和 lastRet 能否相等便可。

public boolean hasNext() {
return cursor != size;
}

關於 next() 完成其實也是比擬簡略的,只需前往 cursor 索引地位處的元素便可,然後修正 cursor、lastRet 便可

public E next() {
checkForComodification();
int i = cursor; //記載索引地位
if (i >= size) //假如獲得元素年夜於聚集元素個數,則拋出異常
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1; //cursor + 1
return (E) elementData[lastRet = i]; //lastRet + 1 且前往cursor處元素
}

checkForComodification() 重要用來斷定聚集的修正次數能否正當,即用來斷定遍歷進程中聚集能否被修正過。modCount 用於記載 ArrayList 聚集的修正次數,初始化為 0,,每當聚集被修正一次(構造下面的修正,外部update不算),如 add、remove 等辦法,modCount + 1,所以假如 modCount 不變,則表現聚集內容沒有被修正。該機制重要是用於完成 ArrayList 聚集的疾速掉敗機制,在 Java 的聚集中,較年夜一部門聚集是存在疾速掉敗機制的,這裡就不多說,前面會講到。所以要包管在遍歷進程中不失足誤,我們就應當包管在遍歷進程中不會對聚集發生構造上的修正(固然 remove 辦法除外),湧現了異常毛病,我們就應當賣力檢討法式能否失足而不是 catch 後不做處置。

final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}

關於 remove() 辦法的是完成,它是挪用 ArrayList 自己的 remove() 辦法刪除 lastRet 地位元素,然後修正 modCount 便可。

public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}

以上所述是小編給年夜家引見的Java聚集Iterator迭代的完成辦法,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved