查看“关于Iterable与Iterator的那些事”的源代码
←
关于Iterable与Iterator的那些事
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:Java]] == Iterable == Iterable 接口:<br/> '''用于支持foreach的循环''':Iterable接口的“iterator()”方法,用于返回一个Iterator对象。(所有实现Iterable接口的集合都可以使用foreach循环进行遍历) <syntaxhighlight lang="java"> package java.lang; ... public interface Iterable<T> { Iterator<T> iterator(); default void forEach(Consumer<? super T> action) { // 验证action是否为null,如果action为null,则抛出NullPointerException Objects.requireNonNull(action); for (T t : this) { action.accept(t); } } default Spliterator<T> spliterator() { return Spliterators.spliteratorUnknownSize(iterator(), 0); } } </syntaxhighlight> Iterable有三个方法,分别是 # Iterator iterator(): #: 返回T类型的元素上的一个迭代器 # default void forEach(Consumer action): #:(JDK 1.8后新增)该方法是循环输出,对内部元素进行'''遍历,并对元素进行指定的操作'''(Consumer是一个函数式接口,可以使用lambda)。例如: #:<syntaxhighlight lang="java"> List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); numbers.forEach(integer -> System.out.println(integer)); </syntaxhighlight> # default Spliterator spliterator(): #:(JDK 1.8后新增)该方法'''提供了一个可以并行遍历元素的迭代器''',以适应现在cpu多核时代并行遍历的需求。(简单说:分割,增加并行处理能力) == Iterator == Iterator 接口:<br/> 主要'''用来操作java里的集合对象'''(collection)。迭代器提供了统一的语法进行集合对象(collection)遍历操作,无需关心集合对象的内部实现方式。(Iterator只能向前移动,无法回退。) <syntaxhighlight lang="java"> package java.util; ... 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()); } } </syntaxhighlight> # boolean hasNext(): #: 如果被迭代遍历的集合还没有被遍历完,返回True # E next(): #: 返回集合里面的下一个元素 # void remove(): #: 删除集合里面上一次next()方法返回的元素 # void forEachRemaining(Consumer action): #: (JDK 1.8后新增)使用Lambda表达式来遍历集合元素。例如: #:<syntaxhighlight lang="java"> List<String> arr=new ArrayList<>(); arr.add("hello"); arr.add(("world")); arr.iterator().forEachRemaining(str-> System.out.println(str)); </syntaxhighlight> == ListIterator == ListIterator :继承自 Iterator 接口。'''只在 List 上进行使用,可以双向迭代'''。 <syntaxhighlight lang="java"> package java.util; public interface ListIterator<E> extends Iterator<E> { boolean hasNext(); E next(); boolean hasPrevious(); E previous(); int nextIndex(); int previousIndex(); void remove(); void set(E e); void add(E e); } </syntaxhighlight> # add(E e):向 List 中添加元素。 # remove():从 List 中删除 next() 或 previous() 返回的最后一个元素。 # set(E e):使用指定元素来覆盖 next() 或 previous() 返回的最后一个元素。 # hasNext():如果还没有到达 List 的末尾,则返回 true,否则返回 false。 # next():返回 List 中的下一个元素。 # nextIndex():返回下一元素的下标。 # hasPrevious():如果还没有到达 List 的开头,则返回 true,否则返回 false。 # previous():返回 List 的上一个元素。 # previousIndex():返回上一元素的下标。 === Iterator 与 ListIterator === # Iterator:可以用于任意集合 —— List、Map、Queue、Set等;只能向前移动,无法回退; # ListIterator:只能应用于 List;支持双向迭代; == Iterable 与 Iterator == === forEachRemaining 与 forEach === forEach:(Iterable) <syntaxhighlight lang="java"> default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } } </syntaxhighlight> forEachRemaining:(Iterator) <syntaxhighlight lang="java"> default void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action); while (hasNext()) action.accept(next()); } </syntaxhighlight> * 同:都是JDK1.8中引入的接口的默认方法,都可以用于遍历集合; * 异: *# forEach()方法内部使用的是'''增强for循环''';forEachRemaining()方法内部是通过使用'''Iterator本身的遍历方法'''。 *# forEach()方法可以'''多次调用''';forEachRemaining()方法第二次调用不会做任何操作(hasNext判断没有了下一个元素)。 === 如何使 Iterator 重新回到起点 === 使用一个iterator时遍历到集合末尾,如何回到开始再次使用next进行循环:'''重新初始化'''。 * (如果是 ListIterator,可以双向遍历) <syntaxhighlight lang="java"> List<String> list=new ArrayList<String>(); list.add("hello"); list.add("world"); list.add("!"); Iterator<String> iterator; for(int i=0;i<2;i++){ iterator=list.iterator(); while(iterator.hasNext()){ System.err.println(iterator.next()); } } </syntaxhighlight> === 关于集合使用 Iterable 与 Iterator === Java中的 Collection: # 可以使用 foreach 遍历:【Collection 接口扩展了 Iterable 接口】。 # 可以使用 Iterator 遍历:【通过“iterator()”返回了一个 Iterator 接口实现类的对象('''一般用内部类实现''')】
返回至“
关于Iterable与Iterator的那些事
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息