黑马程序员技术交流社区

标题: 迭代器里的小问题 [打印本页]

作者: Gump    时间: 2013-12-13 11:20
标题: 迭代器里的小问题
  1. public static void method_iterator()
  2.         {
  3.                 ArrayList al = new ArrayList();
  4.                
  5.                 al.add("java01");
  6.                 al.add("java02");
  7.                 al.add("java03");
  8.                 al.add("java04");
  9.                
  10.                 Iterator it = al.iterator();
  11.                 while (it.hasNext())
  12.                 {
  13.                         Object obj = it.next();
  14.                         if (obj.equals("java02"))
  15.                         {
  16.                                 it.remove();
  17.                                 sop("Obj="+obj);

  18.                         }
  19.                 }
  20.                 sop(al);
复制代码

可能是前面基础不太好,有点不太理解 Object obj = it.next();  这里我知道有多态,可能也涉及到内部类等,但是我想得到大神们一些精辟的更全面的讲解,顺便再请教一下 it.remove(); 这里为什么不用obj.remove(); 谢谢大家
作者: 依然    时间: 2013-12-13 11:42
Object obj = it.next();本来it.next()这里要用的泛型,在你听接下来的视频中会学习到,这里就讲这个意思是把it.next()转换为Object类型,Object是所有类的父类。
Itreator 中不能使用remove方法,要使用ListItreator才可以再迭代的时候使用remove方法
  1. ListIterator it = al.listIterator();
复制代码


作者: 侠客梦的懒猫    时间: 2013-12-13 11:53
对于你说的“这里为什么不用obj.remove()”,obj是一个object的对象,它不能将自己删除,我们只能通过我们的迭代器(Iterator)来操作这个集合
作者: 風諾    时间: 2013-12-13 14:23
本帖最后由 風諾 于 2013-12-13 14:30 编辑

楼主可能对多态和迭代是怎么回事还不是完全明白,我说一下我的看法

之所以用 Object obj = it.next();可能是出于这样的考虑:
你对集合添加的都是String类型的元素,但是不要忘记了,集合可以装不同类型的元素。当你添加多个不同类型元素的时候(比如既有int又有String),你这里只能用Object obj = it.next();因为迭代的时候每次出来的元素类型都可能不同,你固定一个类是不能通用的。而根据多态使用Object类对象接收就没有这个问题。

之所以是it.remove();而不是obj.remove();原因在于:
Object obj = it.next();该语句体现了多态的性质,左侧是父类引用,右侧是子类实体对象。对于这样的情况,并且调用非静态方法。编译时,编译器检查语法,会找父类是否有该方法。很明显Object类没有remove()方法,编译会出问题(这也是多态的访问局限性)。而Iterator接口中的remove()方法是删除迭代器返回的最后一个元素(通过next()返回元素),你上面调用了next(),返回了一个元素。it.remove()操作就是删掉这个元素



作者: Gump    时间: 2013-12-13 17:04
風諾 发表于 2013-12-13 14:23
楼主可能对多态和迭代是怎么回事还不是完全明白,我说一下我的看法

之所以用 Object obj = it.next();可能 ...

感谢详细解答!
作者: Gump    时间: 2013-12-13 17:05
依然 发表于 2013-12-13 11:42
Object obj = it.next();本来it.next()这里要用的泛型,在你听接下来的视频中会学习到,这里就讲这个意思是 ...

感谢!!




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