海洋,Java容器类源码剖析之Iterator与ListIterator迭代器(根据JDK8),拉菲红酒

体育新闻 admin 2019-05-05 163 次浏览 0个评论
网站分享代码

一、基本概念

迭代器是一个目标,也是一种规划形式,Java有两个用来实完成迭代器的接口,别离是Iterator接口和承继自Iterator的ListIterator接口。完成迭代器接口的类的目标有遍历调集目标,挑选调集中的元素和删去调集中元素的办法。而在运用它时不用知道该调集目标底层的结构。Java类库中完成Iterator接口的迭代器只能正向遍历调集中的元素,而完成ListIterator接口的迭代器不只能够正向遍历,还能够反向遍历调集中的元素。

二、源码分析

2.1、Iterator接口与ListIterator接口的承继与完成

图2.1 Java迭代器类的承继与接口实天下第一相书现(部分)

ListIterator接口承继了Iterator海洋,Java容器类源码分析之Iterator与ListIterator迭代器(依据JDK8),拉菲红酒接口。在AbstractList、ArrayList和Vecto沈隽寒r这三个类中的内部类ListItr完成了ListIterator接口,这三个类的内部类ListItr又别离承继了在这三个类中完成了Iterator接口的内部类Itr。完成Li成都化装校园stIterator的类还有LinkedList的内部类ListItr。完成Iterator的类还有LinkedList的内部类DescendingIterator,HashMap的内部打底裤类EntryIterator,KeyIterator,ValueIterator,以及TreeMap的内部类PrivateE澳门赌王ntryIterator等。

2.2、迭代器接口办法

1)迭代器的向前移动与向后移动图解

2)Iterator接口办法

package java.util;
import java.util.function.Consumer;
public interface Iterator {
boolean hasNext();
/* 在Java中,这个办法的详细完成一般用来在遍历容器时,调用该办法使迭代器向前移动一位,来检测调集中是否还有下一个元素,还有下一个元素回来true,不然回来false*/

E next();
/* 完成这个办法,在遍历容器时,调用该办法将迭代器向前移动一位,并将迭代器跳过的一个元素作为办法的回来值。该办法用来回来调集中下一个元素。
在调用next()办法前,先调用hasNext()办法判别调集中是否还有下一个元素 */
default void 秦家有兽remove() { throw new UnsupportedOperationException("remove"); }
/* 完成这个办法,用来删去在右归丸的成效与效果迭代器调用next()办法迭代器跳过的一个元素*/
default void forEachRemaining(Consumer
/* 完成这个办法来次序遍历容器中的每个元素,用来完成调集类的ForEach遍历操作*/
}

宥3)ListIterator接口办法

package java.util;
public i混世四猴nterface ListIterator extends Iterator {

boolean hasNext();//同Iterator接口,用来检测迭国牛通讯代器前面是否还有元素

E next();
// 同Iterator接口,使迭代器向前移动一位,取得迭代器跳过的下一个元素
boolean hasPrevious();
// 完成这个办法来检测当时迭代器方位后边是否有元素,用于反向遍历

E previous();
/* 完成这个办法,将迭代器向后移动一位,并将迭代器跳过的后边的一个元素作为办法回来值,在调用该办法前需求调用hasPrevious办法来判别迭代器前是否有元素 */

int nextIndex();//完成该办法获取迭代器前面一个元素的索引
int previousIndex();//完成该办法获取迭代器后边一个元素的索引
void remove();
/* 完成该办法,用来删去迭代器调用next()办法或调用previous()办法时迭代器跳过的一个元素 */
void set(E e);//完成该办法在迭代器遍历时修正元素
void add(E e);//完成该办法在迭代器遍历时增加元素
}

2.3、容器类与迭代器的联系

1)Iterator接口。阅览源码可知,Collectiion接口完成了Iterable接口,Iterable有一个回来一个Iterator目标的iterator()办法,所以承继和完成了Collection接口的一切容器类及其子类和完成类都有一个回来Iterator目标的的iterator()办法。Java中有许多容器类中都规划有完成了Iterator接口的内部类,如ArrayList和LinkedList等类。HashMap和TreeMap类刘也行女友王诺诺中也包括有完成了Iterator的内部类,来对Map中的KeySet、Value和EntrySet进行迭代。Iterable接口的源代码如下:

public interface Iterable {
Iterator iterator();//完成这个办法,该办法回来一个Iterator迭代器目标。
default void forEach(Consumer
Objects.requireNonNull(action);
for (T t 李春平: this) {
action.accept(t);
}
}//完成这个办法来对容器进行ForEach遍历

default Spliterator spliterator(关节炎的症状) {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}

2)ListIterator接口。检查源码能够发现,List接口中有两个回来List海洋,Java容器类源码分析之Iterator与ListIterator迭代器(依据JDK8),拉菲红酒Iterator目标的办法,如下。List接口下的的ArrayList和LinkedList都有回来ListIterator目标的办法。

ListIterator listIterator();//完成这个办法,该办法回来一个ListIterator迭代器海洋,Java容器类源码分析之Iterator与ListIterator迭代器(依据JDK8),拉菲红酒目标,迭代器初始化后,一般迭代器坐落在容器第一个元素后边。
L丁晓楠istIterator listIterator(int index);//完成这个办法,回来一个指定了开端遍历容器时迭代器初始方位的ListIterator迭代器目标
  • ArrayList类规划有完成了ListIterator接口的内部类ListItr(爱努努不过ArrayList的温州人才网listIte深圳市公安局rator(final int index)办法并未运用这个内部类,而是在办法中又规划了一个ListIter海洋,Java容器类源码分析之Iterator与ListIterator迭代器(依据JDK8),拉菲红酒ator匿名内部类作为办法回来值,能够发现ArrayList的Iterator()办法也是调用了这个办法来构建迭代器目标)。ArrayList类中部分有关源码如下
 private class ListItr extends Itr implements ListIterator {
ListItr(int index) {
super();
cursor = index;
}
 public Iterator iterator() {
return listIterator();
}
public ListIterator listIterator(final int index) {
checksosForComodification();
rangeCheckForAdd(index);
final int offset = this.offset;
return new ListIterator() {//回来了一个ListIterator匿名内部类
int cursor海洋,Java容器类源码分析之Iterator与ListIterator迭代器(依据JDK8),拉菲红酒 = index;
int lastRet = -1;
int expectedModCount = ArrayList.this.modCount;
public boolean hasNext() {
return cursor != SubList.this海洋,Java容器类源码分析之Iterator与ListIterator迭代器(依据JDK8),拉菲红酒.size;
}
  • LinkedList类也有一个内部类ListItr完成了ListIterator接口,LinkedList的listIterator()办法回来了这个内部类的实例。LinkedList中部分有关源码如下
 public ListIterator listIterator(int 海洋,Java容器类源码分析之Iterator与ListIterator迭代器(依据JDK8),拉菲红酒index) {
checkPositionIndex(index);
return new ListItr(index);
}
private class ListItr implements ListIterator {

欢迎作业一到五年的Java工程师朋友们参加Java程序员开发: 721575865peak

群内供给免费的Java架构学习材料(里边有高可用、高并发、高功能及分布式、Jvm功能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构材料)合理使用自己每一分每一秒的时刻来学习提高自己,不要再用"没有时刻“来粉饰自己思想上的懒散!趁年青,用力拼,给未来的自己一个告知!