Java中的集合

本文详细介绍了Java中Iterable和Iterator接口的区别,以及ArrayList、LinkedList、HashSet和HashMap等数据结构的遍历机制。重点阐述了iterator()、forEach()、remove()等方法的作用和使用场景。
摘要由CSDN通过智能技术生成

一.继承关系图

出处链接

单值集合继承图
双值类型

二.Iterable 与 Iterator

在Java中,IterableIterator是两个用于集合遍历的接口。
Iterable

Iterator<T> iterator()

  • 作用:这个方法是Iterable接口的核心。返回一个Iterator<T>,用于遍历类型为T的对象集合。
  • 实现原理:实现Iterable接口的任何类都必须实现此方法,以提供一个可以迭代其元素的迭代器。

default void forEach(Consumer<? super T> action)

  • 作用:此方法用于对Iterable的每个元素执行给定的操作,直到所有元素都被处理或操作抛出异常为止。
  • 参数
    • Consumer<? super T> action:一个函数式接口,它接受一个类型为T的输入并执行操作,通常不返回结果。
  • 实现原理:使用iterator()方法来迭代Iterable的元素,并对每个元素应用action操作。使用Objects.requireNonNull(action)确保如果传递的Consumer为null时抛出NullPointerException,这样强制action不为空。
  • 使用场景:lambda表达式。

default Spliterator<T> spliterator()

  • 作用:该方法为Iterable中的元素提供一个Spliterator。Spliterator主要用于提供对元素序列的高效并行迭代方式。
  • 实现原理:通过Spliterators.spliteratorUnknownSize(iterator(), 0)方法创建一个Spliterator。此方法使用由iterator()方法提供的迭代器和初始特征0(意味着要迭代的元素大小未知),并且Spliterator没有额外的特征,如SORTEDSIZED
  • 使用场景:Spliterators在与Java的Streams API一起使用时非常有用,允许集合被顺序或并行处理。
    Iterator
    Iterator<E>接口是集合框架的一部分,用于遍历集合中的元素。

E next()

  • 作用next()方法用于返回迭代中的下一个元素。
  • 实现原理:调用next()方法时,它将从集合中返回当前位置的元素,并将迭代器的位置向前移动一个单位。如果迭代器已经到达集合的末尾,再调用next()方法将会抛出NoSuchElementException

default void remove()

  • 作用remove()方法用于从集合中移除next()方法最后一次返回的元素。
  • 实现原理remove()方法是一个默认方法,其默认实现是抛出UnsupportedOperationException,表示不支持删除操作。这是因为并非所有的迭代器都需要支持删除操作。

default void forEachRemaining(Consumer<? super E> action)

  • 作用forEachRemaining(Consumer<? super E> action)方法用于对迭代器剩余的每个元素执行给定的操作,直到所有元素都被处理或操作本身抛出异常。
  • 实现原理
    • 首先,通过Objects.requireNonNull(action)检查传入的action参数是否为null,确保提供了一个有效的消费者行为。
    • 然后,使用while循环遍历迭代器。循环中调用hasNext()方法检查是否还有元素。如果有,就通过next()方法获取下一个元素,并将其传递给action.accept()方法进行处理。

总结

Iterable接口

  • 定义Iterable是一个允许其内容被迭代的接口,它定义在java.lang包中。
  • 主要方法
    • iterator():这个方法返回一个Iterator实例,用于遍历集合中的元素。
  • 使用场景:任何实现了Iterable接口的类的对象可以使用增强型for循环(也称为for-each循环)进行遍历。例如,所有实现了Collection接口的类(如List, Set等)都实现了Iterable接口。

Iterator接口

  • 定义Iterator是一个用于遍历集合中元素的接口,定义在java.util包中。
  • 主要方法
    • hasNext():检查集合中是否还有元素。
    • next():返回集合中的下一个元素。
    • remove():从集合中移除最近通过此迭代器返回的元素(可选操作)。
  • 使用场景Iterator是实现迭代逻辑的工具,通常用在需要明确控制集合中元素访问顺序的场合,或者在迭代过程中需要从集合中移除元素的场合。

区别

  • 功能定位Iterable提供了一种获取迭代器的方法,是对集合可遍历性的一个抽象;而Iterator则提供了迭代的具体实现,包括元素的顺序访问和删除等操作。
  • 所处包Iterable位于java.lang包中,是Java语言的核心部分;Iterator位于java.util包中,是集合框架的一部分。

总结

  • Iterable提供了一种统一的方式来获取Iterator,后者才是执行实际遍历的工具。
  • 通过调用 .iterator() 方法获得的迭代器并不直接指向集合的第一个元素,而是位于第一个元素之前的一个位置。可以将其视为一个头节点,它初始时位于集合的“开始位置之前”。这是为了允许迭代器在开始遍历前有一个统一的起点。
  • 使用迭代器的 remove() 方法时,它并不是移除下一个元素,而是移除最近通过 next() 方法返回的元素。这意味着迭代器在调用 next() 之后,其“当前位置”视为刚刚通过 next() 方法访问过的那个元素。随后调用 remove() 将删除这个“当前位置”的元素。
List<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry"));
Iterator<String> iterator = list.iterator();

if (iterator.hasNext()) {
    System.out.println(iterator.next()); // 输出 "Apple",迭代器现在位于Apple之后
}

iterator.remove(); // 删除 "Apple"

code

在这里插入图片描述

  • 解释:可以看到ArrayList通过内部类实现了属于自己的Iterator,用来给Iterableiterator方法返回一个迭代器

三.List

1.ArrayList

ArrayList源码分析(基于JDK8)
手写ArrayList

2.LinkedList

LinkedList源码分析(基于JDK8)

四.Set

1.HashSet

HashSet源码分析(基于JDK8)

2.TreeSet

待整理

五.Map

1.HashMap

HashMap源码分析(基于JDK8)

  • 15
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值