美文网首页
Iterator:迭代器实现?ArrayList, Linked

Iterator:迭代器实现?ArrayList, Linked

作者: 木头与琉璃 | 来源:发表于2019-11-01 17:53 被阅读0次
    • ArrayList中迭代器的实现
      • Iterator的实现
        /**
         * ArrayList中迭代器Iterator的实现
         */
        private class Itr implements Iterator<E> {
            int cursor;       // 游标,下个元素的索引
            int lastRet = -1; // 当前元素的索引
            int expectedModCount = modCount; 
    
            Itr() {}
    
            public boolean hasNext() {
                return cursor != size; // 如果游标<数组的长度,则还有元素
            }
    
            @SuppressWarnings("unchecked")
            public E next() {
                // 删除了校验代码
                cursor = i + 1; //
                return (E) elementData[lastRet = i];
            }
    
            public void remove() {
                try {
                    ArrayList.this.remove(lastRet);
                    cursor = lastRet;
                    lastRet = -1;
                    expectedModCount = modCount;
                } catch (IndexOutOfBoundsException ex) {
                    throw new ConcurrentModificationException();
                }
            }
    
            @Override
            @SuppressWarnings("unchecked") 
            //遍历数组,并对数组中的每个元素按照consumer中的动作进行处理
            public void forEachRemaining(Consumer<? super E> consumer) {
                Objects.requireNonNull(consumer);
                final int size = ArrayList.this.size;
                int i = cursor;
                if (i >= size) {
                    return;
                }
                final Object[] elementData = ArrayList.this.elementData;
                
                while (i != size && modCount == expectedModCount) {
                    //将元素e传入闭包consumer中进行处理
                    consumer.accept((E) elementData[i++]);
                }
                cursor = i;
                lastRet = i - 1;
                checkForComodification();
            }
    
            
        }
    
    • ListIterator的实现
        /**
         * An optimized version of AbstractList.ListItr
         */
        private class ListItr extends Itr implements ListIterator<E> {
            ListItr(int index) {
                super();
                cursor = index;
            }
                
            public boolean hasPrevious() {
                return cursor != 0;
            }
    
            // nextIndex == cursor
            public int nextIndex() {
                return cursor;
            }
    
            // previousIndex = cursor - 1 不使用lastRet是因为父类remove的时候lastRet会被置位-1
            public int previousIndex() {
                return cursor - 1;
            }
    
            @SuppressWarnings("unchecked")
            public E previous() {
                // 删除了校验的代码,只剩下核心代码
                int i = cursor - 1;
                Object[] elementData = ArrayList.this.elementData;
                cursor = i;
                return (E) elementData[lastRet = i];
            }
    
            public void set(E e) {
                //设置元素
                try {
                    ArrayList.this.set(lastRet, e);
                } catch (IndexOutOfBoundsException ex) {
                    throw new ConcurrentModificationException();
                }
            }
    
            public void add(E e) {
                checkForComodification();
    
                try {
                    int i = cursor;
                    ArrayList.this.add(i, e);
                    cursor = i + 1;
                    lastRet = -1;
                    expectedModCount = modCount;
                } catch (IndexOutOfBoundsException ex) {
                    throw new ConcurrentModificationException();
                }
            }
        }
    
    • LinkedList
    private class ListItr implements ListIterator<E> {
            private Node<E> lastReturned;
            private Node<E> next;
            private int nextIndex;
            private int expectedModCount = modCount;
    
            ListItr(int index) {
                // assert isPositionIndex(index);
                next = (index == size) ? null : node(index);
                nextIndex = index;
            }
    
            public boolean hasNext() {
                return nextIndex < size;
            }
    
            public E next() {
                checkForComodification();
                if (!hasNext())
                    throw new NoSuchElementException();
    
                lastReturned = next;
                next = next.next;
                nextIndex++;
                return lastReturned.item;
            }
    
            public boolean hasPrevious() {
                return nextIndex > 0;
            }
    
            public E previous() {
                checkForComodification();
                if (!hasPrevious())
                    throw new NoSuchElementException();
    
                lastReturned = next = (next == null) ? last : next.prev;
                nextIndex--;
                return lastReturned.item;
            }
    
            public int nextIndex() {
                return nextIndex;
            }
    
            public int previousIndex() {
                return nextIndex - 1;
            }
    
            public void remove() {
                checkForComodification();
                if (lastReturned == null)
                    throw new IllegalStateException();
    
                Node<E> lastNext = lastReturned.next;
                unlink(lastReturned);
                if (next == lastReturned)
                    next = lastNext;
                else
                    nextIndex--;
                lastReturned = null;
                expectedModCount++;
            }
    
            public void set(E e) {
                if (lastReturned == null)
                    throw new IllegalStateException();
                checkForComodification();
                lastReturned.item = e;
            }
    
            public void add(E e) {
                checkForComodification();
                lastReturned = null;
                if (next == null)
                    linkLast(e);
                else
                    linkBefore(e, next);
                nextIndex++;
                expectedModCount++;
            }
    
            public void forEachRemaining(Consumer<? super E> action) {
                Objects.requireNonNull(action);
                while (modCount == expectedModCount && nextIndex < size) {
                    action.accept(next.item);
                    lastReturned = next;
                    next = next.next;
                    nextIndex++;
                }
                checkForComodification();
            }
    
            final void checkForComodification() {
                if (modCount != expectedModCount)
                    throw new ConcurrentModificationException();
            }
        }
    

    相关文章

      网友评论

          本文标题:Iterator:迭代器实现?ArrayList, Linked

          本文链接:https://www.haomeiwen.com/subject/nevwvctx.html