import java.util.*;
public class Test {
    public static void main(String []args) {
        ArrayList arrlist = new ArrayList();
        Iterator<String> itr = arrlist.iterator();   
        String str1 = "Think before you act.\n";
        String str2 = "full of courtesy,full of craft.\n";
        String str3 = "Best is cheapest.\n";
        String str4 = "Look before you leap.\n";
        String str5 = "take time when time comes.\n";
        arrlist.add(str1);
        arrlist.add(str2);
        arrlist.add(str3);
        arrlist.add(str4);
        arrlist.add(str5);
        System.out.println("输出集合内容");
        while(itr.hasNext())
            System.out.println(itr.next()+"\n");
    }
}
   Iterator<String> itr = arrlist.iterator(); // 这句话为什么非要写在加入集合元素的后面.如果前在前面会总出问题.iterator();这个函数的作用是什么,我理解是把实现List接口的对象转换成实现Iterator接口的对象,可是一想又不对,为什么这么想呢,首先,书里写到set list.map都已经实现了接口Iterator,这点我又不明白了,接口可以实现接口的吗?我认为不能.可是他为什么这么说呢?其二,如果就算书上写到他们三个接口都已经实现了Iterator接口,好像就没有必要用arrlist.iterator();函数转换了吧.我认为直接就可以写Iterator<String> itr = arrlist; 还有itr不单单是个引用吗?如果是一个引用按理说加元素前后再转换都无所谓了.各位理解明白大哥们帮我解释下吧.

解决方案 »

  1.   

    在进行迭代的时候,不能对集合进行增删的操作,除非用的是Iterator,ListIterator等迭代器中自带的方法public interface List<E>extends Collection<E>,public interface Collection<E>extends Iterable
    是继承,不是实现
      

  2.   

    Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。set,list都extends了Collection接口,而它又extends了Iterable接口。arrlist.iterator();是要得到一个迭代器对象,跟你转型有什么关系???Iterable是接口,不是对象!小弟弟,多看看api,还有,这么明显歧视性的发帖是不对的!~
      

  3.   

    楼主您好呀,既然提到我了,那我力所能及地说一下吧。
    Iterator<String> itr = arrlist.iterator(); // 这句话为什么非要写在加入集合元素的后面.如果前在前面会总出问题.
    能不能说详细一点呢?“为什么非要写在加入集合元素的后面”是什么意思?
    iterator();这个函数的作用是什么,我理解是把实现List接口的对象转换成实现Iterator接口的对象,
    这个并不是将 List 对象转换成为 Iterator 对象,而是将返回一个可以用于迭代 List 中存放元素的迭代器。由于各种 List 的实现都不一样,有用数组实现的 ArrayList,有使用链表实现的 LinkedList,那这两种实现要进行其中元素遍历的话,使用的方式肯定是不一样的(ArrayList 使用数组下标索引遍历,LinkedList 使用链表指针遍历)。如果是这样的话,我们就没有办法统一对各种 List 的实现来进行内部元素的遍历了,因此我们就需要对于遍历采取统一的模式,这样的话就产生了一个 Iterator 的接口。对于 ArrayList 来说,它的 Iterator 实现中 next() 肯定是将其内部索引增加一个,而 LinkedList Iterator 的实现中 next() 肯定是通过当前节点的下一节点。Iterator 存在的目的是为了适应不同 List 甚至是集合的实现,而定义的一个迭代集合内部元素的高层抽象。有了 Iterator 我们并不需要考虑其内部是用数组、链表还是红黑树实现的,内部是如何遍历的。Iterator 在这里的应用就充分地将具体的实现与迭代的方式耦合程度降至最低了。
    接口可以实现接口的吗?我认为不能.可是他为什么这么说呢?
    接口不能实现接口,但接口可以继承接口,甚至可以继承多个接口。我一般把接口继承了另一个接口称为接口扩展了另一个接口,呵呵。
    其二,如果就算书上写到他们三个接口都已经实现了Iterator接口,好像就没有必要用arrlist.iterator();函数转换了吧.我认为直接就可以写Iterator<String> itr = arrlist; 
    类型不同,不能直接这样强转的。因为 List 扩展了 Iterable 接口,并没有扩展 Iterator 接口。有兴趣的话,可以去看看 java.lang.Iterable 和 java.util.Iterator 这两个接口的 API 文档,看看这两个接口有些啥关系。再想一下为什么要这样?
    如果我说得不清楚,或者你还有什么不清楚的地方,在下面回复一下吧。
      

  4.   

    谢谢解释得很明白.但是由于我是初学java但对其内部原理还是有着理解的欲忘的.不要认为我是没学会走就想跑的人. 学习嘛.理解原理很重要.学习的本质不就是这个吗? 有的人总是认为新手就会用就行了.不懂原理怎么可能会用?难道企业总会是那样1+1=2的题?  我上次不意间看到你和论坛另一位同好的交流互动贴.发现你在java的领域绝非一般.理解非常深.很佩服你.谢谢你的精彩回答.