java迭代器逆序_迭代器
提供一種方法順序訪問一個聚合對象中的各個元素,而又不需要暴露該對象的內部表示。
迭代器模式(Iterator)實際上在Java的集合類中已經廣泛使用了。我們以List為例,要遍歷ArrayList,即使我們知道它的內部存儲了一個Object[]數組,也不應該直接使用數組索引去遍歷,因為這樣需要了解集合內部的存儲結構。如果使用Iterator遍歷,那么,ArrayList和LinkedList都可以以一種統一的接口來遍歷:
List list = ...
for (Iterator it = list.iterator(); it.hasNext(); ) {
String s = it.next();
}
實際上,因為Iterator模式十分有用,因此,Java允許我們直接把任何支持Iterator的集合對象用foreach循環寫出來:
List list = ...
for (String s : list) {
}
然后由Java編譯器完成Iterator模式的所有循環代碼。
雖然我們對如何使用Iterator有了一定了解,但如何實現一個Iterator模式呢?我們以一個自定義的集合為例,通過Iterator模式實現倒序遍歷:
public class ReverseArrayCollection implements Iterable {
// 以數組形式持有集合:
private T[] array;
public ReverseArrayCollection(T... objs) {
this.array = Arrays.copyOfRange(objs, 0, objs.length);
}
public Iterator iterator() {
return ???;
}
}
實現Iterator模式的關鍵是返回一個Iterator對象,該對象知道集合的內部結構,因為它可以實現倒序遍歷。我們使用Java的內部類實現這個Iterator:
public class ReverseArrayCollection implements Iterable {
private T[] array;
public ReverseArrayCollection(T... objs) {
this.array = Arrays.copyOfRange(objs, 0, objs.length);
}
public Iterator iterator() {
return new ReverseIterator();
}
class ReverseIterator implements Iterator {
// 索引位置:
int index;
public ReverseIterator() {
// 創建Iterator時,索引在數組末尾:
this.index = ReverseArrayCollection.this.array.length;
}
public boolean hasNext() {
// 如果索引大于0,那么可以移動到下一個元素(倒序往前移動):
return index > 0;
}
public T next() {
// 將索引移動到下一個元素并返回(倒序往前移動):
index--;
return array[index];
}
}
}
使用內部類的好處是內部類隱含地持有一個它所在對象的this引用,可以通過ReverseArrayCollection.this引用到它所在的集合。上述代碼實現的邏輯非常簡單,但是實際應用時,如果考慮到多線程訪問,當一個線程正在迭代某個集合,而另一個線程修改了集合的內容時,是否能繼續安全地迭代,還是拋出ConcurrentModificationException,就需要更仔細地設計。
練習
小結
Iterator模式常用于遍歷集合,它允許集合提供一個統一的Iterator接口來遍歷元素,同時保證調用者對集合內部的數據結構一無所知,從而使得調用者總是以相同的接口遍歷各種不同類型的集合。
總結
以上是生活随笔為你收集整理的java迭代器逆序_迭代器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第三季2:ORTP库的源码分析、RTP发
- 下一篇: 托马斯微积分是数学守旧派的代表作