黑马程序员技术交流社区

标题: 集合框架—迭代器Iterator的用法不明白,请高手指教 [打印本页]

作者: 田晓莉    时间: 2015-3-20 15:19
标题: 集合框架—迭代器Iterator的用法不明白,请高手指教
集合框架部分,对集合中元素进行操作有两种方式:1,对象调用函数;2,迭代器方法。
例:对集合中元素进行操作。下面代码中标问号的地方好晕,不知道该怎么用,求教~~
  1. class ListDemo
  2. {
  3. public static void main(String[],args)
  4. {
  5. //对象操作
  6. ArrayList al = new ArrayList();//定义ArrayList类型的集合 al
  7. al.add("java 01");
  8. al.add("java 02");
  9. al.add("java 03");//向al中添加元素
  10. System.out.println(al);

  11. //迭代器操作
  12. Iterator it = al.iterator();//定义迭代器,?1此处为什么不能new?
  13. while(it.hasNext())
  14. {
  15. Object obj = it.next();//?2这里为什么定义Object类型的对象呢?
  16. if(obj.equals("java02"))   //?3这里用obj,下面移除元素又用it
  17. {
  18. al.add("java08");//同时采取两种数据操作方式不安全
  19. it.remove("java08");//迭代器方法操作
  20. }
  21. }
  22. }
  23. }
复制代码

作者: 女神从来不加班    时间: 2015-3-20 16:12
1.迭代器是集合内部对象 不用new 2.因为不能保证你存进集合里的都是什么类型的元素 所以要用所有类型的父类object去接收 3.因为那是it的方法啊 当然用it调用啊 obj才是集合中的元素 做判断自然用它去做
作者: 田晓莉    时间: 2015-3-20 19:30
女神从来不加班 发表于 2015-3-20 16:12
1.迭代器是集合内部对象 不用new 2.因为不能保证你存进集合里的都是什么类型的元素 所以要用所有类型的父类 ...

我能说我没看明白么:'(
作者: 女神从来不加班    时间: 2015-3-20 20:02
田晓莉 发表于 2015-3-20 19:30
我能说我没看明白么

这。。。 你别急 好好看一下集合那部分的视频或者是书 这段代码真的不难的
作者: Catface    时间: 2015-3-20 20:51
多理解一下就行,比老师讲的那么清楚了都
作者: 1659177869    时间: 2015-3-20 22:18
进来看看,学习学习
作者: 夜班心桥    时间: 2015-3-20 22:54
您好,下面是我的理解。
【1】al.iterator(),您说,这里为什么不可以new,因为Iterator为接口,不可以new啊。其实你去看iterator方法的原码会发现,在方法里,它就创建了一个迭代器的实现类对象,源码如下:
    public Iterator<E> iterator() {
        return new Itr();
    }
这里Itr为Iterator的一个内部类,所以你有这样的疑问。说明你考虑的还是挺多的,挺好的。
【2】Object obj = it.next();
因为集合可以存储各种引用型对象,所以你无法确定集合里面具体是什么类型,只能用Object类型接收。迭代器,你可以把它当成集合的一种遍历方式。每一种集合的迭代器,在其集合中,都有各自的实现方式,所以把迭代器定义成接口。
【3】你用了Iterator作为它的迭代器,这里可能会有一个并发修改操作异常。因为,在对集合迭代的时候,不允许集合和迭代器都对元素进行操作。可以这样做:
ListIterator lIt = al.listIterator();ListIterator是Iterator的子接口。它可以add(Object obj)也可以remove(),可以满足你的需求。
作者: 夜班心桥    时间: 2015-3-20 22:59
补充第一条, Itr implements Iterator;
补充第二条,如果你往后看到泛型的话,假设ArrayList<String> al = new ArrayList<String>();这样当你获取迭代器的时候,也可以泛型限制。Iterator<String> it = al.iterator(); 这样,你在迭代的时候,取出元素,就不用是Object类型了,String s = it.next();希望能帮助到您。有问题,大家一起交流,努力啊!
作者: 卢乾荣    时间: 2015-3-21 00:10
哥们,你还是集合方面的底子没打好,最好看一下毕老师的视频Collection集合框架这里的东西需要多看几遍的,Iterator就相当于for()中遍历数组的,只不过它是用于遍历元素的。操作对象元素,如果你使用的是集合就用集合,不能在迭代器中又用集合又用迭代来操作,容易出错的
作者: Etby    时间: 2015-3-21 01:00
1.迭代器是内部类 而且必须针对特定容器才能使用   




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2