Java简单迭代器例子

一直好奇Foreach的语法,想ArrayList和HashMap,为什么foreach就可以遍历呢,今天自己做了一个简单的实现。

 

public class SimpleForeach<T> implements Iterable<T>, Iterator<T>{
    
    private T[] t;
    
    /**
     * 迭代的游标值,-1表示迭代未开始。
     */
    private int index = -1;
    private int size;
    
    public SimpleForeach(T[] t) {
        this.t = t;
        this.size = t.length;
    }

    @Override
    public Iterator<T> iterator() {
        return this;
    }

    /**
     * Foreach首先调用这个方法,判断迭代是否已经结束。
     */
    @Override
    public boolean hasNext() {
        boolean flag =  index < size - 1;
        if (index == size -1) {
            index = -1;
        }
        
        return flag;
    }

    /**
     * Foreach游标移动以及获取迭代值的逻辑方法
     */
    @Override
    public T next() {
        if (index < size - 1) {
            index++;
            return t[index];
        }
        
        return null;
    }

    @Override
    public void remove() {
        for (int i = size - 1; i >= 0; i--) {
            if (t[i] != null) {
                t[i] = null;
                return;
            }
        }
    }

}

 测试方法如下:

 

@Test
    public void testSimpleForeach() {
        String[] strs = {"1", "2", "3", "4", "5"};
        
        
        SimpleForeach<String> foreach = new SimpleForeach<String>(strs);
        for (String str : foreach) {
            System.out.println(str);
        }
        
        for (String str : foreach) {
            System.out.println(str);
        }
    }

 在iterator(),hasNext()和next()这三个方法打上断点,可以清楚的知道迭代的过程。

首先进入iterator()方法,获得迭代器。

跟着进入hasNext()方法,判断迭代时候已经到数组的末端。

next()方法则处理游标的移动,迭代值的计算和返回。

 

至于为什么会按照这样的逻辑走,那主要是因为Java编译器,编译器或将Foreach语法编译成如上所说的代码,最后运行时就Foreach语法就生效了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值