概述
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知识持续持续更新,你值得拥有!
谢谢阅读 ----知飞翀
最后
以上就是清新麦片为你收集整理的for、foreach、iterator三种遍历集合方法解密for、foreach、iterator三种遍历集合方法解密的全部内容,希望文章能够帮你解决for、foreach、iterator三种遍历集合方法解密for、foreach、iterator三种遍历集合方法解密所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复