顶层接口Iterable和Collection接口

本文深入介绍了Java集合框架中的Iterator接口及其在ArrayList和HashSet中的应用。Iterator作为访问集合的主要方式,提供了hasNext()和next()方法进行遍历。同时,文章对比了Iterator和ListIterator的区别,指出ListIterator可以双向遍历并提供额外功能。对于List,还探讨了不同遍历方式,包括for循环、Iterator和foreach,并提出了最佳实践:对于支持RandomAccess的列表推荐使用for循环,否则建议使用Iterator或foreach。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

顶层接口Iterable

Iterable接口中只有一个Iterator接口方法,Iterator也是一个接口,其主要有如下两个方法hasNext()和next()方法。

boolean hasNext();
E next();

Iterator是一个迭代器,详细内容见
Java中Iterator用法整理

Collection接口

package java.util;
import java.util.function.Predicate;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
public interface Collection<E> extends Iterable<E> {
    int size();
    boolean isEmpty();
    boolean contains(Object o);
    Iterator<E> iterator();
    Object[] toArray();
    boolean add(E e);
    boolean remove(Object o);
    boolean containsAll(Collection<?> c);
    boolean removeAll(Collection<?> c);
    default boolean removeIf(Predicate<? super E> filter) {
        Objects.requireNonNull(filter);
        boolean removed = false;
        final Iterator<E> each = iterator();
        while (each.hasNext()) {
            if (filter.test(each.next())) {
                each.remove();
                removed = true;
            }
        }
        return removed;
    }
    boolean retainAll(Collection<?> c);
    void clear();
    int hashCode();
    @Override
    default Spliterator<E> spliterator() {
        return Spliterators.spliterator(this, 0);
    }
    default Stream<E> stream() {
        return StreamSupport.stream(spliterator(), false);
    }
    default Stream<E> parallelStream() {
        return StreamSupport.stream(spliterator(), true);
    }
}

Java集合详解

面试拓展

  • Q1 迭代器 Iterator 是什么?
    Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。Iterator 接口提供遍历任何 Collection 的接口。
  • Q2 Iterator 怎么使用?有什么特点?
    集合想获取一个迭代器可以使用 iterator() 方法:
List<String> list = new ArrayList<>();
Iterator<String> it = list. iterator();
while(it. hasNext()){
  String obj = it. next();
  System. out. println(obj);
}

Iterator 的特点是只能单向遍历,但是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。

  • Q3 如何边遍历边移除 Collection 中的元素?
    边遍历边修改 Collection 的唯一正确方式是使用 Iterator.remove() 方法,如下:
Iterator<Integer> it = list.iterator();
while(it.hasNext()){
   *// do something*
   it.remove();
}
  • Q4 Iterator 和 ListIterator 有什么区别?
  1. Iterator 可以遍历 Set 和 List 集合,而 ListIterator 只能遍历 List。
  2. Iterator 只能单向遍历,而 ListIterator 可以双向遍历(向前/后遍历)。
  3. ListIterator 实现 Iterator 接口,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。
  • Q5 遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么?Java 中 List 遍历的最佳实践是什么?
    遍历方式有以下几种:
  1. for 循环遍历,基于计数器。在集合外部维护一个计数器,然后依次读取每一个位置的元素,当读取到最后一个元素后停止。
  2. 迭代器遍历,Iterator。Iterator 是面向对象的一个设计模式,目的是屏蔽不同数据集合的特点,统一遍历集合的接口。Java 在 Collections 中支持了 Iterator 模式。
  3. foreach 循环遍历。foreach 内部也是采用了 Iterator 的方式实现,使用时不需要显式声明 Iterator 或计数器。优点是代码简洁,不易出错;缺点是只能做简单的遍历,不能在遍历过程中操作数据集合,例如删除、替换。
    最佳实践:Java Collections 框架中提供了一个 RandomAccess 接口,用来标记 List 实现是否支持 Random Access。
    如果一个数据集合实现了该接口,就意味着它支持 Random Access,按位置读取元素的平均时间复杂度为 O(1),如ArrayList。
    如果没有实现该接口,表示不支持 Random Access,如LinkedList。
    推荐的做法就是,支持 Random Access 的列表可用 for 循环遍历,否则建议用 Iterator 或 foreach 遍历。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值