for、foreach、iterator三种遍历集合方法解密

for、foreach、iterator三种遍历集合方法解密


在我们处理集合(List、Set等)的时候,经常会用到遍历手段来打印输出集合的内容,众所周知集合的遍历手段有3种,for、foreach和iterator(迭代器),但是这三种遍历手段却是不尽相同的,掌握它们的特点才能在实际的开发种规避不该出现的异常。(因为不当的遍历方法会出错哟!)下面我们一起来看看这三种遍历方法。


for遍历方法

想必这种方法定是我们最熟悉的遍历方法,for循环遍历相较于foreach而言代码稍微复杂,但是在for循环内可以对集合进行动态修改、删除等操作。如果硬要说其局限性,个人觉得在特殊情况下找取for遍历结束条件比较困难,但for作为大多数语言的基本语法自然是不可妄自评论的。下面展示for遍历的截图:


Iterator和foreach概述 

Java的集合类可以使用for...each循环:

  • List
  • Set
  • Map
  • Queue
  • Deque

如何让自己编写的集合类使用for...each循环:

  • 实现Iterable接口
  • 返回Iterator对象
  • 用Iterator对象迭代
  • 代码实现:
//ReadOnlyList  使用了内部类调用外部类
public class ReadOnlyList<E> implements Iterable<E> {
	E[] array;
	
    @SafeVarargs
	public ReadOnlyList(E... array) {
		this.array = array;
	}

	@Override
	public Iterator<E> iterator() {
		return new ReadOnlyIterator();
	}

	class ReadOnlyIterator implements Iterator<E> {
		int index = 0;

		@Override
		public boolean hasNext() {
			return index < ReadOnlyList.this.array.length;
		}

		@Override
		public E next() {
			E e = array[index];
			index++;
			return e;
		}
	}
}

//main
public static void main(String[] args) throws Exception {
    ReadOnlyList<String> list = new ReadOnlyList<>("apple", "pear", "orange");
	for (String s : list) {
		System.out.println(s);
	}
}

使用Iterator模式进行迭代的好处:

  • 对任何结合都采用统一访问模型
  • 调用者对集合内部结构一无所知
  • 集合类返回的Iterator对象知道如何迭代
  • Iterator是一种抽象的数据访问模型

iterator遍历方法

iterator是一种迭代器的遍历方法,可能最开始接触这个概念的时候有点晦涩难懂,但是其使用确实非常简洁方便。今天我想跟大家说说iterator的实现原理:

iterator原理分析:从上图可以看出Iterator是一个接口,Iterator作为java.util包下的类自然就是设计作为工具类来使用的,在Iterator接口中有hasNext()、next()、remove()、forEachRemaining(Consumer<? super E> action)共4个方法,所以不难看出iterator在ArrayList或hashSet等集合中都有各自的实现类(见下图),这样做的目的是用Iterator接口来统一调用各种具体的实现类,方便了调用者调用(只需要记住Iterator中的方法就可以),避免了每个类独立创建迭代方法而增加程序猿的负担,同时让设计者也较为方便的管理各种迭代方法。


foreach遍历方法

细心的你一定发现了iterator遍历中端疑了,没错!在iterator的4个方法中有一个比较特殊forEachRemaining(Consumer<? super E> action)从方法名字我们不难看出这就是foreach的底层实现方法呀(又惊喜又意外)!下面还是以ArrayList为例看看其源码中对forEachRemianing方法的实现细节


警告

在实际使用中,for方法是允许一边遍历一边更改、删除等处理集合的——动态修改,但是foreach和iterator方法而是不被允许的,这是因为在iterator内部是先将ArrayList的数据读进来然后再对读进来的信息做处理,并且不允许我们在遍历的同时对ArrayList进行修改。下面分别对for和iterator进行实验:

for实验:

iterator实验:


欢迎关注CSDN博客--知飞翀,各种Java知识持续持续更新,你值得拥有! 

                                                                     谢谢阅读                 ----知飞翀

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值