java集合学习笔记:iterableiterator(代码片段)

笑虾 笑虾     2022-10-23     551

关键词:

Java 集合学习笔记:Iterable、Iterator

UML


此图内含 Collection.uml 可在 Idea 中打开

在学习设计模式的时候就有一个"迭代器模式",JDK中提供了一套实现:Iterator
Java中有了 泛型 + 迭代器 感觉下半辈子基本就告别手动实现迭代器模式了。

Iterable_可迭代

JDK8 之前

此接口表示容器实现了迭代器模式,拥有 iterator() 方法,可以返回一个迭代器对象 Iterator

限定符和类型方法和说明
Iterator<T>iterator()
唯一的方法用来返回一个迭代器 Iterator 对象。

JDK8 新增 default 方法

限定符和类型方法和说明
default voidforEach(Consumer<? super T> action)
Iterable的每个元素执行给定的操作action,直到处理完所有元素或操作抛出异常为止。
default Spliterator<T>Spliterator spliterator()
在这个Iterable所描述的元素上创建一个 Spliterator 可分迭代器。

forEach挺好用的,相信很多人已经用上了。它底层是 for( obj : list) 所以 remove 的老坑还在。
遍历中需要删除元素的时候,乖乖用 Iteratornext() + remove()

List<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5));
list.forEach(System.out::println);

spliterator 返回一个可拆分迭代器。做并发处理拆分任务时用的上。

List<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5));
Spliterator<Integer> spliterator = list.spliterator();
Spliterator<Integer> spliterator2 = spliterator.trySplit();

System.out.println("原 spliterator:");
spliterator.forEachRemaining(System.out::print); // 原 spliterator:345

System.out.println("\\n拆分出去的 spliterator2:");
spliterator2.forEachRemaining(System.out::print); // 拆分出去的 spliterator2:12

Iterator_迭代器

JDK8 之前

迭代器接口,定义了一个迭代器所必须实现的方法。

限定符和类型方法和说明
booleanhasNext()
后面还有更多元素时返回true
Enext()
返回下一个元素。
default voidremove()
移除刚才next()返回的元素。remove 只能与next成对使用。
  • 示例代码
// 借助 Arrays.asList 初始化一个 ArrayLIst
List<Integer> arrayList = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));
// 证明 arrayList 可写。 ( Arrays.asList 返回的 List 是只读 )
arrayList.add(6);
System.out.println(arrayList);
// 获取迭代器
Iterator<Integer> iterator = arrayList.iterator();
while (iterator.hasNext())
    Integer ele = iterator.next();
    System.out.println(ele);
    if(ele == 3) iterator.remove(); // 元素等于 3 删除            

System.out.println(arrayList); // 检查结果

JDK8 新增 default 方法

修饰符和返回类型方法和说明
default voidforEachRemaining
它接受一个消费者,对剩余的元素进行逐个处理。
List<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5));
Iterator<Integer> iterator = list.iterator();
iterator.next();
iterator.next();
// 1、2 已经被迭代过了,forEachRemaining 只会对剩余的元素进行操作。
iterator.forEachRemaining(System.out::print); // 345

参考资料

笑虾:forEach 遍历中 remove 的BUG,及 Java8 的新推荐。

java.lang.Iterable 可迭代
java.util.Iterator 迭代器
java.util.Collection
java.util.List
java.util.ArrayList

java学习笔记-集合运算

Java学习笔记-集合运算List.retainAll交集CollectionUtilsJava8Stream参考资料List.retainAll交集//测试数据List<Integer>listA=IntStream.rangeClosed(1,6).boxed().collect(Collectors.toList());List<Integer>listB&# 查看详情

java集合_学习笔记

一、集合  1、集合类也称容器类,主要负责保存、盛装其他数据。  2、集合可以保存数量不确定的数据,保存具有映射关系的数据(也称关联数组)。  3、Java5后提供一些多线程安全的集合类,放在java.util.concurrrent。(u... 查看详情

java集合学习笔记

集合容器结构图:java容器类类库的用途是保存对象,分为两个概念,collection和map。collection保存单一的元素,而map保存相关联的键值对。collection    中基本方法:intsize():获取集合的元素个数booleanadd(Ee):向集合中添... 查看详情

java集合学习笔记:hashmap(代码片段)

Java集合学习笔记:HashMapUML简介阅读源码属性字段1.静态属性2.成员属性HashMap结构静态工具方法hash【算法学习】^加>>>减少碰撞comparableClassFor(Objectx)compareComparables(Class<?>kc,Objectk,Objectx)tableSizeFor(intcap)【算法学习】32 查看详情

java集合学习笔记:abstractlist(代码片段)

Java集合学习笔记:AbstractListequals(Objecto)hashCode()indexOf(Objecto)lastIndexOf(Objecto)clear()addAll(intindex,Collection<?extendsE>c)equals(Objecto)ItrListItrSubList参考资料equals(Objecto)实现equa 查看详情

java集合学习笔记:map(代码片段)

Java集合学习笔记:MapUML简介源码阅读嵌套类interfaceEntry<K,V>静态方法comparingByKey()comparingByKey(Comparator<?superK>cmp)comparingByValue()comparingByValue(Comparator<?superV>cmp)比较器InterfaceCo 查看详情

java学习笔记5.1.1集合-集合概念与分类

文章目录零、本讲学习目标一、为何引入集合(一)数组局限性(二)可能的场景(三)解决的方法二、集合的定义(一)集合就是容器(二)集合类演示任务:实现数组降序三、集合的分类(一)单列集合-Collection(二)双列... 查看详情

java集合学习笔记:hashmap(代码片段)

Java集合学习笔记:HashMapUML简介阅读源码属性字段1.静态属性2.成员属性静态内部类classNode<K,V>静态工具方法hash(Objectkey)comparableClassFor(Objectx)compareComparables(Class<?>kc,Objectk,Objectx)tableSizeFor(intcap)构造方法H 查看详情

java学习笔记集合底层原理

本篇博客主要介绍的是底层原理,如果想学习集合的方法可以参考我们之前总结的一篇博客:https://blog.csdn.net/qq_44713772/article/details/117045583一、Collection集合Collection接口是单列集合类的父接口,这种集合可以将数据一... 查看详情

java学习笔记集合转数组---toarray()

1packagep2;23importjava.util.ArrayList;4importjava.util.Arrays;5importjava.util.List;67publicclassToArray{89publicstaticvoidmain(String[]args){1011/*12*集合转数组13*使用的是Collection接口中的toArray方法。14*集合转成数组:可以 查看详情

java集合类学习笔记2

二,具体的集合集合类型描述ArrayList一种可以动态增长和缩减的索引序列LinkedList一种可以在任何位置进行高效地插入和删除操作的有序序列ArrayDeque一种用循环数组实现的双端队列HashSet一种没有重复元素的无序集合TreeSet一种有... 查看详情

集合框架学习笔记

集合框架目录概述Collection接口和Iterator接口:Map接口:工具类Collection和Arrays:古老的接口类与接口:一、Java集合类概述:(一)集合的概念javaSE包含了由一组类和接口组成的java集合框架(JavaCollectionFramework,简称JCF),其主要... 查看详情

java集合学习笔记:比较器comparablecomparator(代码片段)

Java集合学习笔记:比较器Comparable、ComparatorComparable隐式比较升序(默认)Comparator显示比较Lambda降序Comparator.reverseOrder降序参考资料Comparable隐式比较packagecom.jerry;importlombok.Data;@DatapublicclassHero 查看详情

java集合学习笔记:比较器comparablecomparator(代码片段)

Java集合学习笔记:比较器Comparable、ComparatorComparable隐式比较升序(默认)Comparator显示比较Lambda降序Comparator.reverseOrder降序参考资料Comparable隐式比较packagecom.jerry;importlombok.Data;@DatapublicclassHero 查看详情

java集合学习笔记:iterableiterator(代码片段)

Java集合学习笔记:Iterable、IteratorUMLIterable_可迭代JDK8之前JDK8新增default方法Iterator_迭代器JDK8之前JDK8新增default方法参考资料UML此图内含Collection.uml可在Idea中打开在学习设计模式的时候就有一个"迭代器模式",JDK中提... 查看详情

java集合学习笔记:list(代码片段)

Java集合学习笔记:ListUMLListUML除了过气的Vector直接实现List接口,其他实现都是通过继承AbstractList实现的。List可以看出List在Collection基础增加的一批方法,都是针对索引用的。限定符和类型方法和说明voidadd(intindex,Eeleme... 查看详情

java集合学习笔记:list(代码片段)

Java集合学习笔记:ListUMLListUML除了过气的Vector直接实现List接口,其他实现都是通过继承AbstractList实现的。List可以看出List在Collection基础增加的一批方法,都是针对索引用的。限定符和类型方法和说明voidadd(intindex,Eeleme... 查看详情

java集合学习笔记:arraylist(代码片段)

Java集合学习笔记:ArrayList简介UML常用方法增删改查迭代内部类静态内部类自动扩容逻辑Java7Java8扩容-核心代码移除-核心代码使用建议参考资料简介ArrayList是List接口的大小可变数组的实现。实现了所有可选列表操作,并允... 查看详情