`
xubindehao
  • 浏览: 243331 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JDk容器之迭代器模式

阅读更多


什么是迭代器模式?

迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。

没有迭代器的时代,我们是怎么遍历容器的

for (int i = 0; i< arrayList.size(); ++i) {

System.out .println(arrayList.get(i));

}

我们需要关心容器内部的方法size(),get()

这样用户去使用容器就和容器强耦合了,必须去了解容器的内部。

迭代器解决什么问题?

从定义可见,迭代器模式是为容器而生。

迭代器解决的问题就是在不关心对象内部细节的情况下去遍历容器。

你可以一股脑的将遍历方法塞到容器对象中去;或者根本不去提供什么遍历算法,让使用容器的人自己去实现去吧。这两种情况好像都能够解决问题。

然而在前一种情况,容器承受了过多的功能,它不仅要负责自己“容器”内的元素维护(添加、删除等等),而且还要提供遍历自身的接口;而且由于遍历状态保存的问题,不能对同一个容器对象同时进行多个遍历。第二种方式倒是省事,却又将容器的内部细节暴露无遗。

而迭代器模式的出现,很好的解决了上面两种情况的弊端。先来看下迭代器模式的真面目吧。

迭代器模式应用举例

内部迭代器

这个我就不说了,就是在容器里面实现一个遍历,然后暴露给客户端,客户端调用方法,即以固定的方式遍历容易

优点:遍历的时候,用户不用关心容器的实现,解耦

缺点:太死板,遍历算法不能客户端实现。

外部迭代器

我个人比较推崇外部迭代器

Java Collections容器中就是利用了外部迭代器去进行容器访问的

JDK中提供了一个迭代器接口

public interface Iterator<E> {

boolean hasNext(); E next(); void remove();

}

这个迭代器可以根据不同的容器有不同的内部实现,例如Itr实现了Iterator<E>

 

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();

}

}

 

这个具体的迭代器类作为一个轻量级容器组合在需要迭代功能的容器中,例如AbstractList中,用户可以通过

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

得到具体的迭代器,在JVM运行时可以得到具体的迭代器,用户得到具体的迭代器后,就可以通过迭代器接口中提供的方法去操纵容器了

 

JDK的这种迭代器实现又叫做多态迭代器。

 

 

这样用户无需关心容器的内部实现,就可以去访问遍历容器,并且还可以利用自己的遍历算法。

 

总结一下好处:

1)  与容器的具体实现解耦

2)  遍历算法的在客户端实现,不死板,保持多样性

补充一点东西,最近看多态迭代器,对迭代器内部的checkForComodification感兴趣了,

代码如下

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

代码中,modCount记录了LinkedList结构被修改的次数。Iterator初始化时,expectedModCount=modCount。任何通过Iterator 修改LinkedList结构的行为都会同时 更 新expectedModCount和modCount,使这两个值相等。通过LinkedList对象修改其结构的方法只更新modCount。所以假 设有两个线程A和B。A通过Iterator遍历并修改LinkedList,而B,与此同时,通过对象修改其结构,那么Iterator的相关方法就会 抛出异常。这是相对容易发现的由线程竞争造成的错误。

所以大家在迭代容器的时候,有修改容器的需求,就用迭代器的iter.remove()吧

分享到:
评论

相关推荐

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

    文章目录Iterator源码剖析(一)简介(二)源码分析 ...外部迭代器的设计背后体现着迭代器设计模式的思想 (二)源码分析 该接口就只有四种方法 // 是否存在未遍历元素 boolean hasNext(); // 返回下一个元素

    jdk-8u181-windows-x64.rar

    8. **增强的for循环(enhanced for loop)**:现在可以用`yield`关键字在增强的for循环中返回值,这对于生成器和迭代器模式非常有用。 9. **并行数组操作**:`java.util.Arrays`和`java.util.Collections`类提供了...

    JDK1.5的源代码

    泛型是JDK 1.5最重要的特性之一,它允许在类、接口和方法中使用类型参数,提高了代码的类型安全性和可读性。通过泛型,可以确保容器(如ArrayList、HashMap)中的元素类型在编译时就被限定,避免了运行时的类型转换...

    Windows jdk 16 64 位 exe 安装包

    **正文** 本篇将详细解析"Windows jdk 16 64 位 exe 安装包"的相关知识点,帮助用户在Windows系统上...在实际开发过程中,持续关注JDK的更新迭代,及时升级到最新版本,可以帮助开发者更好地应对不断变化的技术需求。

    JDK1.5 API完整版

    增强的for循环提供了一种简洁的方式来遍历集合、数组等可迭代对象,无需手动管理索引和迭代器。 7. **注解(Annotations)** 注解是一种元数据,用于向编译器或JVM提供有关代码的附加信息。它们可以在编译时或...

    jdk1.5.0_12源代码

    例如,`java.util.List&lt;T&gt;`接口和`Collections.sort(List)`方法展示了泛型在容器和算法上的应用。 2. **枚举(Enums)**: JDK1.5引入的枚举类型结束了Java中使用常量类来模拟枚举的尴尬局面。枚举可以看作是一种...

    《面向对象技术与方法》14、对象容器.pdf

    ### 面向对象技术与方法之对象...Java类库提供的容器类和迭代器设计模式为开发者提供了强大的工具,而类属机制更是极大地提升了容器使用的便利性和安全性。理解并掌握这些知识点对于开发高质量的面向对象程序至关重要。

    java设计模式

    行为型设计模式如责任链模式、命令模式、解释器模式、迭代器模式、访问者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式,主要关注对象之间的交互和行为。 Spring框架,作为Java企业...

    JDK1.5 32位和64位.rar

    7. **类型安全的隐式迭代器**:通过引入`Iterator&lt;T&gt;`接口,迭代器返回的对象类型与容器中存储的元素类型一致,增强了安全性。 8. **静态导入**:允许一次性导入某个类的所有静态成员,避免重复的类名引用。 了解...

    JDK1.5-1.6-1.7新特性

    JDK 1.5引入的增强for循环(也称为foreach循环),使得遍历集合、数组和其他迭代器支持的数据结构变得更加简单。例如,`for (int i : array) {...}`这样的语法使得迭代元素无需手动管理索引。 6. **匿名内部类**:...

    Java与模式.part16-18.rar

    - **行为型模式**:模板方法模式、策略模式、职责链模式、命令模式、解释器模式、迭代器模式、访问者模式、备忘录模式、状态模式、观察者模式,这些模式关注对象之间的交互和行为。 3. **Java集合框架** - **容器...

    良葛格Java JDK 5.0 学习笔记 - 文字编辑器制作

    综上所述,《良葛格Java JDK 5.0 学习笔记——文字编辑器制作》不仅提供了关于Java编程的具体指导,还深入探讨了软件工程的最佳实践,如需求分析、设计模式、界面设计原则以及持续集成和重构等高级主题。这对于初学...

    jdk 1.5新特性笔记

    虽非官方特性,但JDK 1.5的改进使得构造器注入成为可能,这是依赖注入模式的一种实现,有助于降低对象之间的耦合度。 以上就是JDK 1.5的主要新特性。这些变化对Java语言的演进起到了关键作用,提高了代码质量和...

    良葛格Java JDK 5.0学习笔记

    这种新的循环结构简化了遍历数组和集合的操作,不再需要索引变量和迭代器。例如:`for (Type item : collection) { // code }`,使得代码更加简洁易读。 5. **变量声明的final关键字**: 在Java 5中,可以在方法...

    设计模式代码(Java实现)

    15. **迭代器模式** (Iterator):提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。Java中的集合框架就广泛使用了迭代器模式。 16. **访问者模式** (Visitor):表示一个作用于某对象结构中的各元素的...

    23种设计模式的java实现.zip

    16. **迭代器模式 (Iterator)**:提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。Java中的集合框架提供了Iterator接口作为迭代器的统一访问方式。 17. **状态模式 (State)**:允许对象在其内部状态...

    Java集合框架常见面试题

    Java集合框架常见面试题 Java集合框架是Java语言中最为重要的框架之一,Java集合框架...Iterator对象称为迭代器(设计模式的一种),迭代器模式是一种行为设计模式,它允许客户端通过单一的接口来遍历不同的集合类型。

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 模板方法模式 访问者模式 设计案例 UML 架构 系统架构能力 基本理论 扩展性设计 可用性设计 可靠性设计 一致性设计 负载均衡设计...

    Java8新特性与设计模式.zip

    设计模式方面,Java 8的新特性为许多经典设计模式提供了新的实现方式,如使用Stream API实现迭代器模式,使用Lambda表达式替换策略模式中的接口实现,使用Optional改进单例模式以防止空指针异常等。理解这些新特性和...

    程序员java基础面试题

    - 单例模式、工厂模式、观察者模式、装饰器模式等常见设计模式的理解和应用 以上只是部分Java基础面试题会涉及的领域,实际面试中还可能包括JVM工作原理、Java 8新特性、Spring框架等进阶话题。准备面试时,除了...

Global site tag (gtag.js) - Google Analytics