java 集合迭代器_Java中的集合迭代器
集合的迭代器
任何集合都有迭代器。
任何集合類,都必須能以某種方式存取元素,否則這個集合容器就沒有任何意義。
迭代器,也是一種模式(也叫迭代器模式)。在java中它是一個對象,其目的是遍歷并選中其中的每個元素,而使用者(客戶端)無需知道里面的具體細(xì)節(jié)。迭代器要足夠的“輕量”——創(chuàng)建迭代器的代價小。所以看迭代器的源代碼就會發(fā)現(xiàn),里面會有很多要求:
iterator方法返回一個Iterator,Iterator返回序列的頭元素。
next方法獲取下一個元素
hasNext檢查還有元素
remove刪除迭代器新返回的元素
下面是迭代器的基本使用
public class UsingIterator {
public static void main(String[] args) {
List names = Arrays.asList("marson", "shine", "summer", "zhu");
Iterator it = names.iterator();
while(it.hasNext()){
String s = it.next();
print(s);
}
for (String s : names){
print(s);
}
System.out.println();
it = names.iterator();
for (int i = 0; i < 4; i++) {
it.next();
}
print(names);
}
}
ListIterator
ListIterator是一個更強大的Iterator子類型,能用于各種List類訪問,前面說過Iterator支持單向取數(shù)據(jù),ListIterator可以雙向移動,所以能指出迭代器當(dāng)前位置的前一個和后一個索引,可以用set方法替換它訪問過的最后一個元素。我們可以通過調(diào)用listIterator方法產(chǎn)生一個指向List開始處的ListIterator,并且還可以用過重載方法listIterator(n)來創(chuàng)建一個指定列表索引為n的元素的ListIterator。
public class ListIteration {
public static void main(String[] args) {
var names = Arrays.asList("marson", "shine", "summer", "zhu");
var it = names.listIterator();
while (it.hasNext()) {
print(it.next() + ", " + it.nextIndex() + ", " + it.previousIndex() + "; ");
}
while (it.hasPrevious()) {
print(it.previous() + " ");
}
print(names);
it = names.listIterator(3);
while (it.hasNext()) {
it.next();
it.set("alias");
}
print(names);
}
}
輸出結(jié)果為:
marson, 1, 0; shine, 2, 1; summer, 3, 2; zhu, 4, 3; zhu summer shine marson [marson, shine, summer, zhu] [marson, shine, summer, alias]
Iterator模式
前面說了,迭代器又叫迭代器模式,顧名思義,只要符合這種模式都能叫迭代器模式,自然也能像前面一樣使用迭代器
那么Iterator模式具體是個什么樣子的模式呢?
我們通過Collection的源碼發(fā)現(xiàn)其中的樣子(為什么要看Collection而不是其他的List?因為Collection是所有容器的基類啊)
通過Collection代碼我們發(fā)現(xiàn)它繼承了一個叫Iterable接口,注解說的很清楚——實現(xiàn)這個接口就說明這個對象是可迭代的;并且其成員函數(shù)也很清晰,只有三個方法
public interface Iterable {
Iterator iterator();
default void forEach(Consumer super T> action);//省略部分代碼
default Spliterator spliterator();//省略部分代碼
}
public interface Iterator {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
...
}
Iterator這個泛型接口才是我們真正實現(xiàn)迭代的核心,通過這些信息我們嘗試來寫一個迭代器
public class CustomIterator implements Iterable {
protected String[] names = ("marson shine summer zhu").split(" ");
public Iterator iterator() {
return new Iterator() {
private int index = 0;
@Override
public boolean hasNext() {
return index < names.length;
}
@Override
public String next() {
return names[index++];
}
public void remove() {
}
};
}
public static void main(String[] agrs) {
for (var s : new CustomIterator()) {
print(s + " ");
}
}
}
到這里,自定義的迭代器就寫完了,實際上我們只需要繼承一個Iterable接口然后實現(xiàn)這個接口就行了,更深入的話,其實還可以自己寫一個listIterator實現(xiàn)雙向的操作數(shù)據(jù)
來源:oschina
鏈接:https://my.oschina.net/u/4353634/blog/4002987
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的java 集合迭代器_Java中的集合迭代器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python tkinter text改
- 下一篇: android xml 列表展示,And