我是靠谱客的博主 传统微笑,最近开发中收集的这篇文章主要介绍Java 迭代器 iterator 和 for 循环的区别一、Iterator二、Iterable三、Iterator与泛型(Genetic)搭配:四、foreach 和 Iterator 的关系,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即无需关心该序列的底层结构是什么样子的。只要拿到这个对象,使用迭代器就可以遍历这个对象的内部。

一、Iterator

Java 提供一个专门的迭代器 «interface»Iterator,可以对某个序列实现该接口,来提供标准的 Java 迭代器。实现 Iterator 后的功能是“使用”一个迭代器。文档定义:

Package java.util;
public interface Iterator<E> {
  boolean hasNext();//判断是否存在下一个对象元素
  E next();
  void remove();
}

二、Iterable

Java 中还提供了一个 Iterable 接口,实现 Iterable 后的功能是“返回”一个迭代器,常用的实现了该接口的子接口有: Collection、Deque、List、Queue 和 Set 等。该接口的 iterator() 返回一个标准的 Iterator 实现。实现这个接口允许对象成为 foreach 语句的目标。就可以通过 foreach 语法遍历你的底层序列。

Iterable 接口包含一个能够产生 Iterator 的 iterator(),并且 Iterable 接口被 foreach 用来在序列中移动。因此如果创建了任何实现 Iterable 接口的类,都可以将它用于 foreach 语句中。文档定义:

Package java.lang;
import java.util.Iterator;
public  interface Iterable<T> { 
  Iterator<T> iterator(); 
}

使用 Iterator 的简单例子:

import java.util.*;

public class TestIterator {
public  static void main(String[] args) {
   List list=new ArrayList();
   Map map=new HashMap();
 //初始化list和map的数据
  for(int i=0;i<10;i++){
    list.add(new String("list"+i) );
    map.put(i, new String("map"+i));
  }
Iterator iterList= list.iterator();//List接口实现了Iterable接口
  //循环list
 while(iterList.hasNext()){
   String strList=(String)iterList.next();
   System.out.println(strList.toString());
  }
 Iterator iterMap=map.entrySet().iterator();
  //循环map
   while(iterMap.hasNext()){
     Map.Entry strMap=(Map.Entry)iterMap.next();
     System.out.println(strMap.getValue());
   }
}

接口 Iterator 在不同的子接口中会根据情况进行功能的扩展。例如针对 List 的迭代器 ListIterator,该迭代器只能用于各种 List 类的访问。ListIterator 可以双向移动。添加了 previous() 等方法.

三、Iterator与泛型(Genetic)搭配:

Iterator 对集合类中的任何一个实现类,都可以返回这样一个 Iterator 对象。可以适用于任何一个类。因为集合类(List和Set等)可以装入的对象的类型是不确定的,从集合中取出时都是 Object 类型,用时都需要进行强制转化,这样会很麻烦,用上泛型,就是提前告诉集合确定要装入集合的类型,这样就可以直接使用而不用显示类型转换。

四、foreach 和 Iterator 的关系

foreach 以用来处理集合中的每个元素而不用考虑集合定下标。就是为了让用 Iterator 简单。但是删除的时候,区别就是在 remove,循环中调用集合remove会导致原集合变化导致错误,而应该用迭代器的 remove 方法。

for 循环和迭代器 Iterator 对比:
①采用 ArrayList 对随机访问比较快,而 for 循环中的 get(),采用的即是随机访问的方法,因此在 ArrayList 里,for 循环较快
②采用 LinkedList 则是顺序访问比较快,Iterator 中的 next(),采用的即是顺序访问的方法,因此在 LinkedList 里,使用 Iterator 较快。
③从数据结构角度分析,for 循环适合访问顺序结构,可以根据下标快速获取指定元素。而 Iterator 适合访问链式结构,因为迭代器是通过 next() 和 Pre() 来定位的,可以访问没有顺序的集合。
④使用 Iterator 的好处在于可以用相同方式去遍历集合中元素,而无需考虑集合类的内部实现(只要它实现了java.lang.Iterable接口)。如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改;如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整。因为 List 有序,Set 无序,结构不同,它们的访问算法也不一样。(由此也说明遍历和集合本身分离了)

最后

以上就是传统微笑为你收集整理的Java 迭代器 iterator 和 for 循环的区别一、Iterator二、Iterable三、Iterator与泛型(Genetic)搭配:四、foreach 和 Iterator 的关系的全部内容,希望文章能够帮你解决Java 迭代器 iterator 和 for 循环的区别一、Iterator二、Iterable三、Iterator与泛型(Genetic)搭配:四、foreach 和 Iterator 的关系所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部