java集合源码学习(一)Iterator、Iterable

在学习集合源码之前,我们应对集合家族有一个清晰的理解。

一、Iterator迭代器

public interface Iterator<E> {

    boolean hasNext();

 
    E next();

 
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

  
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

hasnext():判断集合是否有下一个元素返回布尔值

next():获取迭代的下一个元素

remove() : 从迭代器指定的集合中移除迭代器返回的最后一个元素。

forEachRemaining(Consumer<? super E> action) : jdk8为Iterator新增的默认方法,该方法可以使用Lambda表达式来遍历集合元素

二、Iterable<T>

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

    //传入一个Consumer类参数,通过调用Consumer里面的accept方法进行遍历    
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

    
    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}

iterator() : 方法该方法没有参数,返回一个能够遍历容器的迭代器 Iterator<T> 。实现Iterable需要重写。

forEach(Consumer<? super T> action) :循环容器中的元素,并对每个元素进行 action 操作,容器中不能有空元素,否则或抛出 NullPointerException 指针异常。

spliterator():spliterator 方法没有参数,返回一个 Spliterator<T> 对象,Spliterator接口是1.8新加的接口,字面意思可分割的迭代器,不同以往的iterator需要顺序迭代,Spliterator可以分割为若干个小的迭代器进行并行操作,既可以实现多线程操作提高效率,又可以避免普通迭代器的fail-fast机制所带来的异常。
 

default的作用

default的意义

  • Default 方法带来的好处是,往接口新增一个Default 方法,而不破坏现有的实现架构。
  • Default方法可以认为是Lambda表达式和JDK类库之间的桥梁。引入Default方法的主要目的是为了升级标准JDK接口,另外也是为了我们最终能在Java8中顺畅使用Lambda表达式。

@contract注解

两个属性

  • value 属性-包含-描述-调用参数-和返回值-之间的-因果关系-的 contract 子句。
  • pure 属性-适用于-不更改-其对象状态-的方法,但只返回一个新值。该属性可以-用作-“忽略方法-调用的-结果”检查的-提示,以-指示-在调用时-应该-使用方法的-返回值。它是假(false)(默认情况下),也可以为真(true)。


@NotNull 限制必须不为null

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,集合类库提供了一个统一的迭代器接口 `Iterator`,用于遍历集合中的元素。通过迭代器,我们可以按照特定顺序访问集合中的元素,而不需要了解底层数据结构的具体实现。 使用迭代器遍历集合的一般步骤如下: 1. 获取集合对象的迭代器:通过调用集合类的 `iterator()` 方法获取迭代器对象。 2. 使用 `hasNext()` 方法检查是否还有下一个元素。 3. 使用 `next()` 方法获取下一个元素。 4. 对当前元素进行操作。 5. 重复步骤 2-4 直到遍历完所有元素。 以下是一个示例代码,展示如何使用迭代器遍历一个 ArrayList 集合: ```java import java.util.ArrayList; import java.util.Iterator; public class IteratorExample { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("Apple"); list.add("Banana"); list.add("Orange"); // 获取迭代器 Iterator<String> iterator = list.iterator(); // 遍历集合 while (iterator.hasNext()) { String element = iterator.next(); System.out.println(element); } } } ``` 上述代码中,通过调用 `list.iterator()` 方法获取了 ArrayList 的迭代器对象。然后使用 `hasNext()` 方法检查是否还有下一个元素,再使用 `next()` 方法获取下一个元素。最后,我们可以对每个元素进行操作,这里简单地将其打印到控制台。 需要注意的是,在使用迭代器遍历集合的过程中,如果在迭代时对集合进行了修改(如添加、删除元素),则需要使用迭代器的 `remove()` 方法来删除元素,以避免出现并发修改异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值