为什么不在接口Collection中定义next()方法来实现遍历呢。我想当具体的容器类实现接口Collection的时候next方法应该容易实现吧。

解决方案 »

  1.   

     TreeSet 有两个iterator 你说怎么实现。
      

  2.   

    光有一个next()功能岂不是太简单了。
    故弄个
    iterator 
      

  3.   

    功能的细化,大概是不要让一个接口具有太多的功能,比如,抽象出一个Iterator, 那可以不用考虑它是set 还是list 等等,只要返回一个Iterator
    就可以实现遍历。与遍历不相关的操作就与它无关了,
      

  4.   

    不同的容器有不同的数据结构,因此每个不同类型的容器有不同的Iterator迭代器,迭代器是用来遍历Collection子类的各个元素,java封装了这些数据结构,开发人员不需要知道内部具体怎么实现,仅当你想要遍历容器中的各个元素时你必须用collection.iterator()返回相应的迭代器,然后通过迭代器访问每一个元素...你学数据结构了吗,建议没学的话补一补......
      

  5.   

    有了iterator可以使容器不局限于一种遍历方式,就像1楼说的,
     
      

  6.   

    iterator便利更直观、清晰!知道不。楼主!
      

  7.   


    ls的回答都够可以的每种集合都有一套api。因而,遍历的时候会出现两类问题
    1。迭代逻辑没有改变,但是需要从一种集合换成另外一种集合。不同的集合自然有不同的遍历接口。所以,需要修改客户端代码。为了修改成新集合的借口(比如从Set改成List,两者的得到元素的方法截然不同)
    2。集合不改,而迭代方式要改。原来只需要读取元素和删除元素。而现在要增加新的元素。这样,原来的集合又要增加新的方法。从而使得客户端逻辑又要大改。综上,如果把以上逻辑抽象成迭代器。那么对于1,所有的程序用的都是统一的接口。集合类型的改动不会影响到客户端代码迭代逻辑的改动。对于2,由于定义了统一接口,那么只需要在集合中增加新的迭代方法,返回新的迭代对象即可。比如#1所说的有两个iterator。而迭代逻辑则几乎不用修改。以上两点在Java Collection中广泛应用。不知这样讲解lz听懂了没?
      

  8.   

    很好的问题。实际上Collection接口继承了Iterable:interface Collection extends IterableIterator的目的在于循环遍历Collection,和循环相关的方法都放到Iterator接口里面去了,而Collection接口本身没有定义像next()这样的方法。
    这样所有的Collection的实例类的循环都可以由Iterator来做。接口就是协议,当你循环collection的时候不需要了解背后的具体实现。@huntor: 2个Iterator是什么意思?
      

  9.   


    ls不知所云。
    Iterable和Iterator根本不是一回事
    Jdk1.5以后,出现Iterable接口是为了实现for ( : )循环。所有实现了Iterable的类都可以用这种for each方式迭代
    Iterator是Java用来实现迭代子模式的接口。
      

  10.   


    其实把Iterator抽出来应该是为了线程安全。如果Collection直接提供next()这样的方法,如果同时多个线程同时循环,那么collection的内部控制的index会乱掉。如果是每个线程都有自己独立的对象Iterator,每个Iterator自己维护内部控制的index,就不会造成混乱。
      

  11.   

    我认为yeajay问这个问题是一定了解数据结构和设计模式,他只是在问why。我认为是个很好的问题:)
      

  12.   

    为什么用Iteratorjava订立Iterator为一个接口
    Java code
    public interface Iterator {
         Object next ();
    }
    这是一个标准,是别的集合类必须都遵循这个标准去开发他们的迭代器来便利集合对象元素,
    因为sun不知道以后都什么集合,也许你也写一个集合类,他是如果用next方法,
    他不能给你订立一套标准,你也不知道怎么去实现,应该怎么去遍历集合,这样就造成了,每个人迭代器都不一样,就不能达到统一的标准去迭代了,sun指定这个标准让你去实现,这样所有迭代器的标准都一样,就可以统一用一个对象来遍历了
      

  13.   


    误人子弟
    index会乱掉???那么你说List.get方法调用的时候index会乱???线程安全???
    JDK线程安全的集合是靠Iterator所属的集合类实现的。
    比如
    Collections.synchronizedList
    用Iterator来实现线程安全纯属无稽之谈你用Iterator循环试试看,在循环的时候删除一个元素。你看看会不会报java.util.ConcurrentModificationException
    Iterator只是一种迭代抽象,而不能实现更多的功能!!!!!!
      

  14.   


    他根本没有说错,在Collection中如果增加了next方法,那么在多线程中遍历这个Collection的时候就会非常麻烦(我指的是没有修改的情况下),因为Collection只能维护一个index记录当前遍历到的位置,那就经常需要增加同步代码
    而且这样导致了Collection还是一个存在状态的对象,所以Java抽象出Iterator来专门完成遍历功能。
      

  15.   


    我要说的,已经在#15说的很清楚了。。绝对不是为了线程安全而添加。因为
    for (int index = 0; index < list.size(); index++) {
         ...
    }for (int index = 0; index < list.size(); index++) {
         ...
    }
    这样的循环变量绝对是线程安全的。
    也更没有必要把循环变量提高到类级变量的高度。至于线程安全,那不是iterator的工作。
      

  16.   

    两个iterator的情况即为List.listIterator方法和List.iterator方法
    是迭代子模式的最好例子。也是我#15所说的第2中情况
      

  17.   

    for (int index = 0; index < list.size(); index++) {
         ...
    }for (int index = 0; index < list.size(); index++) {
         ...
    }
    以上代码在集合没有变更的时候绝对是线程安全的,
    在集合有变更的时候还是会报错
    所以加不加Iterator,其实对于线程安全程度没有影响。如果硬要把Iterator加入的理由归咎于增加了一个和上面index变量一样意思的变量的维护。我认为,这样做是不必要得。加入Iterator
    只是为了把迭代逻辑从集合类中分离开。
    使得迭代逻辑怎么变,跟集合类完全无关。集合类只要搞好数据结构就可以了。如果需要增加迭代逻辑,那么只需要增加Iterator类,用新的方法返回即可(List.listIterator方法和List.iterator方法)#15说的很清楚了
      

  18.   

    关键是get方法是list中的方法,而且对于LinkedList这样的集合是非常非常非常慢的,所以用Iterator是非常必要的。对于LinkedList是绝对不应该使用get来进行遍历的!!!!
      

  19.   

    对于Set这样的接口,更是连get方法都不会存在!
    我个人也觉得遍历ArrayList之类的,用get(i)是更方便也更高效,但是对于Collections接口来说,iterator是非常必要的遍历手段
      

  20.   

    iterator是个接口吧这样的话 不管是 map  还是 set  还是 list 等等都有统一的遍历方法,这不更好
    而且Collections 里面不可能对所有的 子类进行 toIterator的封装吧
      

  21.   

    @rainsilence:
    同意你从iterator的设计模式的含义来解释它存在于Collection的解释。但是yeajay问的问题是:如果Collection直接定义hasNext()这样的函数有何不可。
    所以举的例子应该是
    while(collection.hasNext()){....} VS Iterator it= collection.iterator();
    while(it.hasNext()){…}的比较。而不是和for (int index = 0; index < list.size(); index++)...}比较。
    显然collection.hasNext()在多线程情况下内部的index会混乱。
      

  22.   

    #15的两种情况很好的解释了为什么不能直接定义在Collection里
      

  23.   

    @rainsilence:所以我说同你从OO设计角度来解释。但是由此带来的线程安全的好处也是正确的。
      

  24.   

    @rainsilence:所以我说同意你从OO设计角度来解释。但是由此带来的线程安全的好处也是正确的。
      

  25.   

    这个问题不是问题 会用就行了
    原因估计比java还复杂
      

  26.   

    楼主的问题你们都没看懂,其实我也遇到这样的问题Iterator这个接口为什么要用内部类实现,再用iterator()这个方法得到这个接口的实现,而不直接让外部类去实现这个接口!!
    比如:让ArrayList直接实现Iterator这个接口,而不是在他的内部再定义一个类去实现这个接口!!!!