java.util.iterable_Iterator与Iterable剖析

Iterable(java.lang) :

可迭代的; 可重复的; 因此实现了这个接口的集合对象支持迭代,是可迭代(able)的。

Iterator(java.util):

iterator就是迭代者(tor),我们一般叫迭代器,它就是提供迭代机制的对象,具体如何迭代,都是Iterator接口规范的。

Iterable

一个集合对象要表明自己支持迭代,能有使用for each语句的特权,就必须实现Iterable接口,且必须实现其中的iterator()方法,生成一个迭代器

注意!!!实现了java.lang.Iterable接口的东西可以用for-each去遍历,但是能用for-each去遍历的不一定实现了该接口,比如数组就是。

这个迭代器是用接口定义的 iterator方法提供的。也就是iterator方法需要返回一个Iterator对象

Iterable源码

package java.lang;

import java.util.Iterator;

import java.util.Objects;

import java.util.Spliterator;

import java.util.Spliterators;

import java.util.function.Consumer;

public interface Iterable {

//产生一个Iterator迭代器,继承Iterable的子类必须实现该方法

Iterator iterator();

//默认方法,子类可以不用实现

default void forEach(Consumer super T> action) {

Objects.requireNonNull(action);

for (T t : this) {

action.accept(t);

}

}

//默认方法,子类可以不用实现

default Spliterator spliterator() {

return Spliterators.spliteratorUnknownSize(iterator(), 0);

}

}

由源码图可以看出,Iterable有三个方法,分别是

1

Iterator iterator();

2

default void forEach(Consumer action){}; JDK 1.8后新增的默认方法

3

default Spliterator spliterator(){}; JDK 1.8后新增的默认方法

Iterator

Iterator被称之为顺序遍历迭代器,jdk中默认对集合框架中数据结构做了实现。

Iterator在实际应用中有一个比较好的点就是,可以一边遍历一遍删除元素。

Iterator源码

package java.util;

import java.util.function.Consumer;

public interface Iterator {

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());

}

}

由源码图Iterator接口中定义了四个方法,分别是

1

boolean hasNext():如果被迭代遍历的集合还没有被遍历完,返回True

2

Object next():返回集合里面的下一个元素

3

remove():删除集合里面上一次next()方法返回的元素

4

void forEachRemaining(Consumer action):

JDK 1.8后新增默认方法 使用Lambda表达式来遍历集合元素

forEachRemaining()与forEach()方法之间的区别?

通过源码,我们可以看出他们之间的区别与联系。

相同点:

都可以遍历集合

都是接口的默认方法

都是1.8版本引入的

区别:

forEachRemaining()方法内部是通过使用迭代器Iterator的所有元素,forEach()方法内部使用的是增强for循环。

forEach()方法可以多次调用,forEachRemaining()方法第二次调用不会做任何操作,因为不会有下一个元素。

iterator示例:

public static void main(String[] args)

{

List li = new ArrayList<>();

li.add(1);

li.add(2);

li.add(3);

//不使用foreach 而手动迭代

Iterator iter = li.iterator(); //获取ArrayList 的迭代器

while(iter.hasNext()) //①先探测能否继续迭代

{

System.out.println(iter.next()); //②后取出本次迭代出的元素

//invoke remove() //③最后如果需要,调用remove

}

}

迭代出来的元素都是原来集合元素的拷贝,Java集合中保存的元素实质是对象的引用(可以理解为C中的指针),而非对象本身。迭代出的元素也就都是引用的拷贝,结果还是引用。

如果集合中保存的元素是可变类型的,我们就可以通过迭代出的元素修改原集合中的对象。

而对于不可变类型,如String 、基本元素的包装类型Integer 都是则不会反应到原集合中。

而for each遍历元素的本质就是通过迭代器遍历元素,所以for each循环能否改变元素的值??

基本类型数组,不可改变。

引用类型数组(除String类型),可以改变。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值