`
SuseLinux
  • 浏览: 26901 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

JDK源码中的Iterator

    博客分类:
  • Java
 
阅读更多

Iterator的意思是迭代器。

JDK源码中,Iterator是一个接口。

 

源码中,实现了Iterator接口的类,有很多:见图

 

1) java.util.*包中,所熟悉的一些Collection子类:AbstractList HashMap Hashtable LinkedHashMap LindedList TreeMap等;

2) java.util.concurrent*包中,诸如 ArrayBlockingQueue ConcurrentHashMap ConcurrentLinkedQueue

3) javax.imageio.*包,javax.print.*包,javax.xml.*包中都存在这样的类(who implemented Iterator接口)

 


 

迭代器相关的接口有两个:Iterator Iterable

 

从名字中,就能猜出它两啥用途:

Iterator意思为迭代器,Iterator及其子类通常是迭代器/迭代子本身的结构与方法;

Iterable意为可迭代的,那些想用到迭代器功能的其它类,如AbstractList HashMap等,需要实现该接口。

 

细看下两个接口文件:

 

Iterator.java  (只有三个方法)

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

 

Iterable.java   (只有一个方法)

public interface Iterable<T> {
    Iterator<T> iterator();
}
 

通常的用法是:

某个类A( AbstractList )想使用迭代器,则它的类声明需是:class A implement Iterable

那么类A实现中,要实现Iterable接口中的唯一方法:Iterator<T> iterator();

这个方法用于返回一个迭代器/迭代子,即Iterator接口及其子类;

 

 

然后在类A中,定义一个内部类S,专门用于实现Iterator接口,定制类A自已的迭代器实现。

即:

class A implement Iterable
{
    Iterator<T> iterator() {...}
    class S implement Iterator<E> 
    {
        boolean hasNext() {....}
        E next() {....}
        void remove() {....}
    }
}
 

另外一个类B (如HashMap)也想使用迭代器,则依葫芦画瓢,方法、类声明啥的都一样,只是方法体不同。

所以,若A类的一个对象a想使用迭代器功能,则需要:

1) 获取迭代器对象: Iterator<E> iter = a.iterator();

2) 然后可以使用迭代器的三个方法进行迭代操作:  iter.hasNext()     iter.next()     iter.remove()

 

 

举例,看看AbstractList类:

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {

    protected AbstractList() {
    }
  
    ...

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

    private class Itr implements Iterator<E> {
     
    int cursor = 0;
    int lastRet = -1;
    int expectedModCount = modCount;

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

	public E next() {
            checkForComodification();
	    try {
		E next = get(cursor);
		lastRet = cursor++;
		return next;
	    } catch (IndexOutOfBoundsException e) {
		checkForComodification();
		throw new NoSuchElementException();
	    }
	}

	public void remove() {
	    if (lastRet == -1)
		throw new IllegalStateException();
            checkForComodification();

	    try {
		AbstractList.this.remove(lastRet);
		if (lastRet < cursor)
		    cursor--;
		lastRet = -1;
		expectedModCount = modCount;
	    } catch (IndexOutOfBoundsException e) {
		throw new ConcurrentModificationException();
	    }
	}

	final void checkForComodification() {
	    if (modCount != expectedModCount)
		throw new ConcurrentModificationException();
	}
    }
}
 

 

  • 大小: 60.7 KB
分享到:
评论

相关推荐

    【JDK1.8源码剖析】外部迭代器Iterator接口

    文章目录Iterator源码剖析(一)简介(二)源码分析 Iterator源码剖析 (一)简介 Iterabtor是从jdk1.2就存在的接口,称为外部迭代器。支持对容器中的元素进行遍历和移除,还支持流式遍历 外部迭代器的特点是:可拔...

    JDK中有关23个经典设计模式的示例

    这些模式被广泛应用于Java等面向对象语言中,JDK(Java Development Kit)本身就是一个很好的实践场所,因为它包含了大量使用这些设计模式的例子。下面我们将详细探讨JDK中的23个设计模式及其应用。 1. 单例模式...

    jdk源码阅读Collection详解

    在JDK源码阅读Collection详解中,我们可以看到Collection接口的实现类有很多,如ArrayList、LinkedList、HashSet、TreeSet等。这些实现类都继承了Collection接口,并实现了其定义的方法。 在实际开发中,我们经常...

    2022年Java源码分析:深入探讨Iterator模式Java教程.docx

    在JDK 1.4.2版本中,由于泛型的引入是在JDK 1.5,所以源码分析可能更专注于基础的类型操作。`toArray()`方法提供了一种将集合转换为数组的途径。`toArray()`有两重形式:一个不接受参数,返回一个Object数组;另一个...

    Jdk1.6 Collections Framework源码解析(2)-LinkedList

    《Jdk1.6 Collections Framework源码解析(2)-LinkedList》 LinkedList是Java集合框架中的一个重要的类,它是List接口的实现,同时继承了AbstractSequentialList,并实现了Deque接口。LinkedList是一种双链表结构,...

    Java源码分析:深入探讨Iterator模式

    本文讨论的源代码版本是JDK 1.4.2,因为JDK 1.5在java.util中使用了很多泛型代码,为了简化问题,所以我们还是讨论1.4版本的代码。 集合类的根接口Collection Collection接口是所有集合类的根类型。它的一个主要的...

    jdk1.8_api:jdk1.8 api源码阅读记录

    在Java开发中,对JDK API的深入理解和熟练运用是提升效率的关键。本文将围绕JDK1.8的API,特别是`AbstractCollection`类中的`toArray()`方法进行详细探讨,旨在帮助开发者更好地掌握这一核心功能。 `...

    ArrayList源码Jdk1.8

    ### ArrayList源码解析(JDK 1.8) #### 概述 `ArrayList`是Java集合框架中的一个核心组件,它提供了动态数组的功能。与固定大小的数组不同,`ArrayList`可以随着元素的增加而自动扩展其容量。在JDK 1.8中,`...

    jdk1.5 src.zip

    本篇文章将围绕"jdk1.5 src.zip"这一主题,深入探讨JDK1.5源码中的核心概念和技术。 1. **泛型(Generics)** JDK1.5引入了泛型,使得开发者可以在定义类、接口和方法时指定类型参数,增强了类型安全性和代码复用...

    【JDK1.8源码剖析】内部迭代器 Iterable接口

    Iterable是从jdk1.5就存在的接口,称为内部迭代器,常用作容器类的接口,以支持遍历操作(同时支持流式遍历) 内部迭代器的特点是嵌入,其迭代行为必须在容器对象内部实现(借助了外部比较器)。一个类如果实现了...

    hashmap_use_in_JDK7.zip

    通过对JDK7中HashMap源码的深入剖析,我们可以了解到HashMap的高效性和内部机制,这对于优化代码和理解数据结构有极大的帮助。同时,也需要注意在不同版本的JDK中,HashMap的实现可能会有所变化,例如JDK8引入了红黑...

    JDK1.8、JDK1.7、JDK1.6区别看这里

    本文主要对比了JDK1.8、JDK1.7、JDK1.6中的源码,对比阅读,发现修改问题以及改进点,具有一定的参考价值。下面是对ArrayList类的详细介绍。 一、基本性质 ArrayList是Java集合框架中的一个重要类,它实现了List...

    java集合源码-jdk-collection:java集合类源码阅读

    集合源码 JDK-Collection集合入门 总的list和set类结构大致如下所示 Map不继承Collection,其结构如下 首先介绍下迭代器的概念 迭代器无非是一个接口,假设我们有一个数组,如果我们要实现迭代器,只需要根据该接口定义...

    design-pattern:7大设计原则+ 23种设计模式(含UML类图)+设计模式在JDK中的源码分析Java语言

    这个压缩包文件“design-pattern:7大设计原则+ 23种设计模式(含UML类图)+设计模式在JDK中的源码分析Java语言”显然是一个关于设计模式的全面学习资源,涵盖了设计原则、多种设计模式以及它们在Java开发中的实际...

    【JDK1.8源码剖析】Collection接口

    Collection接口是集合层次结构中的根接口。 (1)下面是常用集合类关系图 Collection  |___List 有序,可重复  |___ArrayList  |___LinkedList   |___Vector   |___Set 无序,不可重复  |___HashSet  |_...

    Java编程精选集锦[科学出版社][2003]配套源码

    这本书的配套源码提供了读者深入理解书中的概念和示例的机会,有助于读者实践并提升编程技能。现在,我们将深入探讨这个压缩包中可能涵盖的一些关键Java知识点。 首先,我们从章节名称来推测可能涉及的内容: 1. *...

    java类源码-JavaCollection:基于JDK1.8的集合类源码分析

    `Collection`接口提供了添加元素、删除元素、遍历元素等基本操作,并定义了迭代器(Iterator)接口来遍历集合中的元素。 在JDK 1.8中,`ArrayList`和`LinkedList`作为两种常见的列表实现,各有特点。`ArrayList`...

    Java基于JDK 1.8的LinkedList源码详析

    "Java基于JDK 1.8的LinkedList源码详析" LinkedList是Java中一个非常重要的数据结构,基于双向链表实现,适用于增删频繁且查询不频繁的场景。今天我们将深入分析LinkedList的源码,了解其内部实现机制和特点。 1. ...

    java8源码-JDKSourceCode:阅读jdk1.8的一些注意事项

    iterator forEach sort removeIf Vector different with ArrayList 2018/3/26 ChangeLogs LinkedList ctor-2 addFirst addLast addAll add indexOf lastIndexOf peek 获取第一个元素,是 null 就返回 null peekFirst...

    jdk_source_learning:jdk原始码学习笔记,人话翻译

    jdk1.8源码学习笔记,人话翻译 前言:前预算开始学习了一些基本的数据结构和算法,算是被弥补了这方面的知识短板,但是可以对一些算法的了解,目前工作当中也并没有应用到这些,因此希望通过结合实际例子来学习,...

Global site tag (gtag.js) - Google Analytics