for,foreach,iterator的用法和区别

转载请标明出处:http://blog.csdn.net/xx326664162/article/details/49451379 文章出自:薛瑄的博客

你也可以查看我的其他同类文章,也会让你有一定的收货!

相同点:

三个都可以用来遍历数组和集合

不同点

1.形式差别
for的形式:

    for(int i=0; i < arr.size();i++){...}

foreach的形式:

     for(int i:arr){...}

iterator的形式:

      Iterator it = arr.iterator();
      while(it.hasNext()){ object o =it.next(); ...}

2.数组大小差别
for需要知道集合或数组的大小,而且需要是有序的,不然无法遍历;
foreach和iterator都不需要知道集合或数组的大小,他们都是得到集合内的每个元素然后进行处理;

3.数组类型差别
for和foreach都需要先知道集合的类型,甚至是集合内元素的类型,即需要访问内部的成员,不能实现态;
iterator是一个接口类型,他不关心集合或者数组的类型,而且他还能随时修改和删除集合的元素,举个例子:

    public void display(Iterator<object> it){
                while(it.hasNext()){
                       system.out.print(it.next()+"");
               }
      } 

当我们需要遍历不同的集合时,我们只需要传递集合的iterator(如arr.iterator())看懂了吧,这就是iterator的好处,他不包含任何有关他所遍历的序列的类型信息,能够将遍历序列的操作与序列底层的 结构分离。迭代器统一了对容器的访问方式。这也是接口的解耦的最好体现。

4.用法差别

  • for循环一般用来处理比较简单的有序的,可预知大小的集合或数组
  • foreach可用于遍历任何集合或数组,而且操作简单易懂,他唯一的不好就是需要了解集合内部类型
  • iterator是最强大的,他可以随时修改或者删除集合内部的元素,并且是在不需要知道元素和集合的类 型的情况下进行的(原因可参考第三点:多态差别),当你需要对不同的容器实现同样的遍历方式时,迭代器是最好的选择!

Iterator实例:
使用Collection类的Iterator,可以方便的遍历Vector, ArrayList, LinkedList等集合元素,避免通过get()方法遍历时,针对每一种对象单独进行编码。

        Collection coll = new Vector(); //LinkedList(); //ArrayList();
        coll.add("Tody");
        coll.add("is");
        coll.add("Sunday.");

        // Output all elements by iterator
        Iterator it = coll.iterator();
        while(it.hasNext()) {
            System.out.print(it.next() + " ");
        }

输出:
Tody is Sunday.

1.hasNext()函数的API解释
boolean java.util.Iterator.hasNext()

hasNext
boolean hasNext()

 Returns true if the iteration has more elements. (In other words, returns true if next() would return an element rather than throwing an exception.)

Returns:

 true if the iteration has more elements

2.next()函数的API解释
Object java.util.Iterator.next()

next
E next()

 Returns the next element in the iteration.

Returns:

the next element in the iteration

Throws:

NoSuchElementException - if the iteration has no more elements
        Collection coll = new HashSet();
        coll.add("Tody");
        coll.add("is");
        coll.add("Sunday.");

        // Output all elements by iterator
        Iterator it = coll.iterator();
        while(it.hasNext()) {
            System.out.print(it.next() + " ");
        }

输出:
is Sunday. Tody

由上面两个例子看出,在List和Set对象中,Iterator的next()方法返回的值是不一样的。
原因是List属于线性集合,元素是有序的,读取时是按照数组的形式,一个接一个的读取,存储也是按照add的顺序添加的。
而Set属于非线性的,是无序的,所以读取的元素与添加的顺序不一定一致。
对于HashSet,其实它返回的顺序是按Hashcode的顺序。
如果迭代也有序,则可以用LinkedHashSet。

转载:
http://blog.csdn.net/ameyume/article/details/6099554
http://blog.csdn.net/iamkila/article/details/7266890

关注我的公众号,轻松了解和学习更多技术
这里写图片描述

发布了244 篇原创文章 · 获赞 799 · 访问量 234万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503

分享到微信朋友圈

×

扫一扫,手机浏览