Iterator源码

Iterator是一个接口,他的实现类都会在类的内部定义一个iterator方法类

public Iterator<E> iterator() {
        return new Itr();
    }

可以看到方法中创建了一个Itr对象,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() {}

        public boolean hasNext() {
            return cursor != size;
        }

        @SuppressWarnings("unchecked")
        public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }

有两个成员变量int cursorint lastRet = -1相当于两个指针,int cursor指向当前集合中的对象,指向上一个集合中对象

hasNext方法

返回值是一个boolean,比较就是看是否遍历完了集合中的对象。

next方法

1.Object[] elementData = ArrayList.this.elementData;ArrayList底层数组的引用赋值给一个Object数组。
2.cursor = i + 1;当前指针加一。
3. return (E) elementData[lastRet = i];返回一个对象

Iterator接口中的remove方法

1.首先明确在使用Iterator遍历数组的时候,是不可以调用List中的方法来进行对象的删除的。会引起异常。
2.遍历集合的时候可以使用for-each循环,其实它在遍历数组的时候底层使用的依然时Iterator。并且使用for-each循环说无法删除对象。如果用for-each循环遍历数组,他其实会使用for循环
3.正确遍历时删除集合中对象的代码:

while(it.hasNext()){
            String elem=it.next();
            if("hanhan".equals(elem)){
                it.remove();
            }
            System.out.println(elem);
        }
        System.out.println(arrayList);

需要注意的是:你使用Iterator删除集合中对象的时候,他依然会把所以的对象都遍历出来,但其实集合中已经删除了。
在这里插入图片描述

那些类可以调用iterator方法

实现了Iterable接口的类可以调用iterator方法。在Iterable中就有抽象的iterator方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值