java it_关于 Java Iterator(迭代器)学习笔记
相信 “迭代” 對于Java程序員來說并不陌生(當然,其他語言的程序員也是如此),在處理數據時,不可避免地會存在對數據的大量遍歷操作。對于我自己而言,學習使用Java語言兩年時間,對于“迭代”的概念還停留在 for:each,for:i的遍歷階段。今天用到了JDK 提供的迭代接口進行 Java 集合的迭代,便決定作以筆記,留作以后學習。
普通 Java 集合迭代(遍歷)
迭代可以簡單理解為遍歷,在沒有 JDK 并未提供迭代器時,我們對于數據的遍歷處理如下:
對于數組的遍歷處理:
Bean[] beans = new Bean[5];
for (int i = 0; i < beans.length; i++) {
beans[i] = new Bean();
// todo something
}
對 ArrayList 的遍歷處理:
ArrayList beanArrayList = new ArrayList();
for (int i = 0; i < beanArrayList.size(); i++) {
beanArrayList.add(new Bean());
// todo something
}
可以看出,如果我們想對一個空的 Java 集合添加數據,那我們就必須知道該集合內部的數據結構(即,以數組和 ArrayList 為例,添加時的操作應該是beans[i] = new Bean();還是beanArrayList.add(new Bean());),這樣就導致了訪問邏輯與集合的結構本身緊密耦合(即,每一種不同的數據集合對應了不同的便利方法),這會使得代碼無法復用。
而 Iterator 可以輕松的解決上述問題.
java.util.Iterator
看一下官方未出的解釋:
public interface Iterator
An iterator over a collection. Iteratortakes the place of Enumeration
in the Java Collections Framework. Iterators differ from enumerations in two ways:
Iterators allow the caller to remove elements from the underlying collection during the iteration with well-defined semantics.
Method names have been improved.
This interface is a member of the Java Collections Framework
就是說,Iterator是一個對 collection 集合進行迭代的迭代器(接口)。Iterator迭代器取代了 Java Collections Framework 中的 Enumeration。該接口是 Java Collections Framework 的成員。迭代器與枚舉有兩點不同:
迭代器允許調用者利用定義良好的語義在迭代期間從迭代器所指向的 collection 移除元素。
方法名稱得到了改進。
.
這也就意味著,Iterator 使用相同的訪問邏輯完成集合的遍歷,使得我們在訪問集合元素時,無需關心不同的集合內部結構。從而降低訪問邏輯與集合本身的耦合度。
Iterator接口源代碼如下:
package java.util;
import java.util.function.Consumer;
public interface Iterator {
// 返回迭代是否有更多的元素。
boolean hasNext();
// 返回迭代器剛越過的元素的引用
E next();
// 從底層集合中移除此迭代器返回的最后一個元素(可選操作)
default void remove() {
throw new UnsupportedOperationException("remove");
}
// 對每個剩余的元素執行給定的操作,直到處理完所有元素或操作拋出異常
default void forEachRemaining(Consumer super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
如何使用 Iterator
在使用中,我們既可以借助hasNext()及next()方法,對已知集合結構的集合對象完成簡單的迭代(類似于之前的方案),就像這樣:
Iterator beanIterator = beanArrayList.iterator();
while (beanIterator.hasNext()) {
Bean bean = beanIterator.next();
// todo something
}
更新于2017.12.03
僅僅這樣不是與之前的方案沒什么區別了嗎?當然,它能做的還可以更多。做到真正不去關心集合內部結構的迭代手段,下述代碼是對一個集合對象的迭代:
public static boolean isExist(Collection beans, Bean bean) {
Iterator iterator = beans.iterator();
System.out.println(beans.getClass().getSimpleName() + ":");
while (iterator.hasNext()) {
if (iterator.next().equals(bean)) {
System.out.println("集合中已存在 Bean[" + bean + "]");
return true;
}
}
return false;
}
Test:
public static final void main(String[] args) {
Bean bean0 = new Bean().setId("01");
Bean bean1 = new Bean().setId("02");
ArrayList beanArrayList = new ArrayList<>();
Queue beanQueue = new LinkedBlockingQueue<>();
HashMap map = new HashMap<>();
beanArrayList.add(bean0);
beanArrayList.add(bean1);
map.put(bean0, bean0);
map.put(bean1, bean1);
beanQueue.add(bean0);
beanQueue.add(bean1);
isExist(map.keySet(), bean0);
isExist(beanArrayList, bean1);
isExist(beanQueue, bean1);
}
輸出結果:
KeySet:
集合中已存在 Bean[Bean{id='01', password='null'}]
ArrayList:
集合中已存在 Bean[Bean{id='02', password='null'}]
LinkedBlockingQueue:
集合中已存在 Bean[Bean{id='02', password='null'}]
總結
所有Collection框架中的j幾乎所有的集合類(或接口)(如ArrayList、Set、Queue等)都實現了(接口也聲明了iterator()方法)自己的內部的迭代器,但無疑都是Iterator的實現。
不過據我現在所了解到的,數組由于其本身的實現方案與 "編譯處理和
JVM 的native()方法有關,似乎不能直接獲取到其本身的迭代器。如果有哪位朋友知道相關方法,請評論告知,不勝感謝。
這是第一次嘗試寫學習筆記,希望以后可以堅持下去,事無巨細地,從點滴累積自己的財富。
總結
以上是生活随笔為你收集整理的java it_关于 Java Iterator(迭代器)学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: java log.error_Logge
- 下一篇: java map clone_Java中
