不同的容器,因为使用了不同的数据结构,就注定了他们的遍历方法是不尽相同的,迭代器模式以接口+实现的方式,实现了为不同的聚合对象容器提供了相同的顺序访问方法,而忽略其底层数据结构,这也成为外部迭代(借助第三方的迭代器器完成的迭代)
java内置的迭代器
如上图是java内置的迭代器的接口图,java的容器中,很多多已经内置迭代器的实现了,我们直接可以使用
如 ArrayList的内置迭代器
如下代码,是ArrayList的部分源码,可以看到他已经内置迭代器了
/**
* An optimized version of AbstractList.Itr
*/
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
Itr() {}......
hash表的迭代器
Hashtable的迭代器
Hashtable的迭代器 hashtable = new Hashtable<String,String>();
hashtable.values().iterator();
hashtable.keySet().iterator();
HashMap的迭代器及5种遍历方式
HashMap map = new HashMap<String,String>();
map.entrySet().iterator();
map.keySet().iterator()
map.values().iterator();
// 先遍历key,再遍历value
for (String key : map.keySet()) {
System.out.println(key + " " + map.get(key));
}
java.util.Iterator<String> iterator = map.keySet().iterator();
while(iterator.hasNext()){
String key = iterator.next();
map.get(key);
}
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
java.util.Iterator<Map.Entry<String, String>> iterator1 = map.entrySet().iterator();
while(iterator1.hasNext())
{
Map.Entry<String, String> entry=(Map.Entry<String, String>) iterator1.next();
System.out.println("Key: "+entry.getKey()+" Value: "+entry.getValue());
}
map.forEach((k,v)-> System.out.println(k+" "+v));
数组,自定义迭代器
java的数组,是没有迭代器的, 下面自定义自己的迭代器, 其实就是实现Iterator接口,重写抽象方法,最后添加上获取迭代器的方法, 代码如下
public interface Iterator {
boolean hasNext();
Object next();
}
@Data
public class Student {
private String name;
private String[] houseWork ;
public Student(String name){
this.name=name;
houseWork = new String[3];
houseWork[0]="语文";
houseWork[1]="数学";
houseWork[2]="英语";
}
public static void main(String[] args) {
Student lisi = new Student("李四");
Iterator iterator = lisi.getIterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
public Iterator getIterator(){
return new studentIterator();
}
private class studentIterator implements Iterator{
private int position;
private studentIterator(){
position=0;
}
@Override
public boolean hasNext() {
if (position<houseWork.length){
return true;
}
return false;
}
@Override
public String next() {
String housework = houseWork[position];
position++;
return housework;
}
}
}
netty的迭代器
ByteBuf byteBuf = Unpooled.wrappedBuffer(new byte[]{1, 2, 3, 4});
byteBuf.forEachByte(b->{
System.out.println(b);
return true;
});
netty的迭代器并没有通过实现Iterator完成,如上的forEachByte()
与普通集合的forEach()
, 如出一辙,入参是ByteProcessor
, 虽然没有标注是函数式接口,但是只有唯一的抽象方法,可以用它迭代遍历每一个元素