Iterator原理及实现

Iterator的作用:
Iterator用于遍历集合中的元素,适用于不知道集合内部结构的情况。用户不再与集合类交互,而是与Iterator交互,其清楚知道集合类的内部状态,通过控制iterator达到遍历集合的目的。

Java API中Iterator接口

public Interface Iterator<E>{
    boolean hasNext();  
   Object next();  
   void remove(); 
}

其中:
hasnext()是判断语句,表示集合中元素是否遍历完
next()相当于指针,返回Object对象,需要强转为需要的类型
remove()删除集合中元素,不常用。

注意:next()是从前往后遍历,若想向前遍历,可以使用继承Iterator接口的ListIterator接口,其含有E previous()方法,可以向前遍历集合元素。但要注意只有List可以使用ListIterator接口(链表迭代器),只有其含有ListIterator()方便,返回ListIterator对象。

迭代器原理实现:

public class YuanLiIterator1 {

    private String[] elem=new String[5];
    private int size=0;

    /**
     * MyIter为实现了Iterator接口的一个内部类
     * @author asus1
     *
     */
    private class MyIter implements Iterator{
        //计数器-->指针 游标
        private int coursor=-1;
        //判断是否存在下一个
        public boolean hasNext(){
            return coursor+1<size;
        }
        //获取下一个
        public String next(){
            coursor++;
            return elem[coursor];
        }
        //删除下一个
        public void remove(){
            //移动数组
            System.arraycopy(elem, coursor+1, elem, coursor, size-(coursor+1));
            size=size-1;
            coursor--;
        }
    }

    public Iterator iterator(){
        return new MyIter();
    }


    //将MyIter类放入方法中,形成一个方法内部类
    public Iterator iterator1(){//方法内部类
        class MyIter implements Iterator{
            private int coursor=-1;
            public boolean hasNext(){
                return coursor+1<size;
            }
            public String next(){
                coursor++;
                return elem[coursor];
            }
            public void remove(){
                System.arraycopy(elem, coursor+1, elem, coursor, size-(coursor+1));
                size=size-1;
                coursor--;
            }
        }
        return new MyIter();
    }

    /**
     * 直接返回一个匿名内部类
     * @return
     */
    public Iterator iterator2(){
        //返回Iterator迭代器接口实现类的对象,匿名内部类
        return new Iterator(){
            private int coursor=-1;
            public boolean hasNext(){
                return coursor+1<size;
            }
            public String next(){
                coursor++;
                return elem[coursor];
            }
            public void remove(){
                System.arraycopy(elem, coursor+1, elem, coursor, size-(coursor+1));
                size=size-1;
                coursor--;
            }
        };
    }

    public static void main(String[] args){
        YuanLiIterator1 list=new YuanLiIterator1();
        Iterator it=list.iterator2();
        while(it.hasNext()){
            System.out.println(it.next());
        }
        System.out.println("-----------------------------");
        it=list.iterator2();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

上面的源码中一共存在三种Iterator的实现方式,但Iterator的具体方法实现都一样:

  1. 通过内部类MyIter实现Iterator,方法iterator()返回一个MyIter对象;
  2. 通过方法内部类实现的,方法iterator1()中有方法内部类MyIter,该方法返回一个MyIter对象;
  3. 通过匿名内部类实现的,方法Iterator2()直接返回了一个匿名内部类
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值