不同的容器,因为使用了不同的数据结构,就注定了他们的遍历方法是不尽相同的,迭代器模式以接口+实现的方式,实现了为不同的聚合对象容器提供了相同的顺序访问方法,而忽略其底层数据结构,这也成为外部迭代(借助第三方的迭代器器完成的迭代)
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
, 虽然没有标注是函数式接口,但是只有唯一的抽象方法,可以用它迭代遍历每一个元素