java iterator代码实现_如何实现java Iterator迭代器功能

本文围绕Java Iterator迭代器功能实现展开,先给出常见迭代代码示例,后尝试写泛型类实现迭代功能遇问题,通过翻阅JDK源码解决。还探讨了与Iterator相似的Iterable接口,指出实现Iterable接口的类可实现forEach功能,解释了接口为实现类提供能力。

这篇文章主要介绍了如何实现java Iterator迭代器功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

今天躺在床上忽然想到一个问题,迭代器的代码是如何实现的?

于是乎不由自主的爬起来敲两行代码。

List list=new ArrayList<>(2);

list.add("java");

list.add("C#");

Iterator iterator=list.iterator();

while (iterator.hasNext()){

System.out.println(iterator.next());

}

上面的代码是java中很常见的一个迭代的功能。

于是自己也想要写一个泛型类,然后支持这种迭代的功能。

于是乎写了一个类似ArrayList的动态数组功能。

package a;

import javax.swing.text.html.HTMLDocument;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Iterator;

public class Gys{

private final static int default_capacity =10;

private int endIndex =0;

private Object[] elemts;

public Gys() {

this.elemts = new Object[default_capacity];

}

public T[] add(T t){

if(elemts.length-1< endIndex){

int newCapcti= default_capacity *2;

elemts= Arrays.copyOf(elemts,newCapcti);

}

elemts[endIndex++]=t;

return (T[])elemts;

}

public int size(){

return endIndex;

}

public T get(int i){

if(i< endIndex){

return (T) elemts[i];

}

throw new RuntimeException("索引超出界限");

}

public static void main(String[] args) {

Gys gys=new Gys<>();

gys.add(5);

gys.add(45);

System.out.println(gys.get(0));

System.out.println(gys.get(1));

}

}

上面的代码怎么都没办法实现Iterator的功能,在idea下怎么都点不出来Iterator的提示;

于是只能去翻阅jdk原码。在ArrayList中看到如下的代码。

1ecdf8a69633356a3b44a15f698d6792.png

在ArrayList中申明一个内部类Itr,并且继承Iterator这个接口,然后实现hasNext()和next()方法。

在定义一个方法专门获取迭代器实例。

public Iterator iterator() { return new Itr(); }

这才明白如何实现迭代器功能;

所以对上面的泛型代码进行改造。

package a;

import java.util.Arrays;

import java.util.Iterator;

public class Gys{

private final static int default_capacity =10;

private int endIndex =0;

private Object[] elemts;

public Gys() {

this.elemts = new Object[default_capacity];

}

public T[] add(T t){

if(elemts.length-1< endIndex){

int newCapcti= default_capacity *2;

elemts= Arrays.copyOf(elemts,newCapcti);

}

elemts[endIndex++]=t;

return (T[])elemts;

}

public int size(){

return endIndex;

}

class Itr implements Iterator{

private int point;

private int len;

public Itr() {

this.point=0;

this.len=endIndex;

}

@Override

public boolean hasNext() {

return point

}

@Override

public T next() {

return (T) elemts[point++];

}

}

public Iterator iterator(){

return new Itr();

}

public T get(int i){

if(i< endIndex){

return (T) elemts[i];

}

throw new RuntimeException("索引超出界限");

}

public static void main(String[] args) {

Gys gys=new Gys<>();

gys.add(5);

gys.add(45);

/*System.out.println(gys.get(0));

System.out.println(gys.get(1));*/

Iterator iterator= gys.iterator();

while (iterator.hasNext()){

System.out.println(iterator.next());

}

}

}

怎么样、这个时候就可以对自己的泛型类Gys实现迭代的功能了。

同时另一个疑问也来了,和Iterator长得异常相似的接口Iterable是干什么的?他和Iterator又是什么关系?

既然实现了迭代的功能,那么为什么foreach的语法无法实现了。

翻开源码看看。

e15558e87668dc762c12cf765609a42a.png

源码中可以看出Iterable接口提供了一个获取迭代器的接口方法。那么又有哪些类实现了接口呢?

使用idea的ctrl+h快捷键调出查看类的全部继承关系。

b4375c92b046f1a625eb7640d50688d5.png

bc98a13041ce81a2649a99b521494b9a.png

我们看到熟悉的Collection接口。

看到Colllection接口中并没有实现这个接口,依然是一个接口方法。继续向下追踪

3c1ebad63e841b862cf6825ad6d21b88.png

看到我们熟悉的ArrayList这个类型实现了iterator方法。

从这个角度来看ArrayList中的iterator()方法不是空穴来风的,他是通过继承collection和Iterable这些接口而来的。

虽然我们上面的泛型类实现了迭代的功能,但是学习了新知识后总要练练手,于是这个时候画蛇添足的对上面的代码继续改造。

package a;

import java.util.Arrays;

import java.util.Iterator;

public class Gys implements Iterable{

private final static int default_capacity =10;

private int endIndex =0;

private Object[] elemts;

public Gys() {

this.elemts = new Object[default_capacity];

}

public T[] add(T t){

if(elemts.length-1< endIndex){

int newCapcti= default_capacity *2;

elemts= Arrays.copyOf(elemts,newCapcti);

}

elemts[endIndex++]=t;

return (T[])elemts;

}

public int size(){

return endIndex;

}

class Itr implements Iterator{

private int point;

private int len;

public Itr() {

this.point=0;

this.len=endIndex;

}

@Override

public boolean hasNext() {

return point

}

@Override

public T next() {

return (T) elemts[point++];

}

}

@Override

public Iterator iterator(){

return new Itr();

}

public T get(int i){

if(i< endIndex){

return (T) elemts[i];

}

throw new RuntimeException("索引超出界限");

}

public static void main(String[] args) {

Gys gys=new Gys<>();

gys.add(5);

gys.add(45);

/*System.out.println(gys.get(0));

System.out.println(gys.get(1));*/

Iterator iterator= gys.iterator();

while (iterator.hasNext()){

System.out.println(iterator.next());

}

}

}

实现了Iterable接口的类,都可以实现forEach功能。

其实forEache的写法最终还是会编译成成迭代器的写法。

写到这想起来之前<>这本书上说的对于接口的描述:

接口是用于给实现类提供某种能力。

从这个例子中可以很清晰的理解这结论的准确性:

Iterable:给实现类提供一个获取迭代器的能力。

Iterator:给实现类提供迭代的能力。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值