A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程洋 中级黑马   /  2014-3-25 11:29  /  1315 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

先看下面代码
  1. import java.util.*;
  2. class ArrayListTest
  3. {
  4.         public static void main(String[]args)
  5.         {
  6.                 ArrayList al=new ArrayList();
  7.                 al.add("chy1");
  8.                 al.add("chy2");
  9.                 al.add("chy3");
  10.                 al.add("chy1");
  11.                 sop(al);
  12.                 ArrayList al1=new ArrayList();
  13.                 Iterator it=al.listIterator();
  14.                 while(it.hasNext())
  15.                 {
  16.                                                 /*l里面的代码换成if(!al1.contains(it.next()))
  17.                                               al1.add(it.next());
  18.                                                               运行的结果就会出错,怎么回事*/
  19.                         Object obj=it.next();
  20.                         if(!al1.contains(obj))
  21.                                 al1.add(obj);
  22.                 }
  23.                 sop(al1);
  24.         }
  25.         public static void sop(Object obj)
  26.         {
  27.                 System.out.println(obj);
  28.         }
  29. }
复制代码

问题在代码中

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

8 个回复

正序浏览
程洋 中级黑马 2014-3-25 13:01:08
9#
确实没有注意到it.next不相同的问题,大意了(注意力都在Object上了)
回复 使用道具 举报
程洋 中级黑马 2014-3-25 12:58:50
8#
本帖最后由 程洋 于 2014-3-25 13:05 编辑

楼上各位,这个程序里面的对集合数据操作安全吗?(在迭代器操作遍历数据时,集合ArrayList也对数据进行了判断和添加的动作.
回复 使用道具 举报
yanzhendong 发表于 2014-3-25 12:37
楼主多态没有学好,it.next()返回的是String对象,String是Object的子类,当父类引用指向子类对象的时候 ...

哦哦!谢谢!
回复 使用道具 举报
刘先斌 发表于 2014-3-25 12:32
应为contains底层是用equals放来比较的。

                                                /*l里面的代 ...

楼主多态没有学好,it.next()返回的是String对象,String是Object的子类,当父类引用指向子类对象的时候,如果子类中重写了父类中的方法那么通过父类引用调用父类中的方法时,执行的是子类中被重写的方法
回复 使用道具 举报
应为contains底层是用equals放来比较的。

                                                /*l里面的代码换成if(!al1.contains(it.next()))
                                              al1.add(it.next());
                                                              运行的结果就会出错,怎么回事*/
这么写的话if(!al1.contains(it.next()))这里调用的是复写Object后的String的equals方法,
                   Object obj=it.next();
                        if(!al1.contains(obj))
                                al1.add(obj);
         这样用的是 Object中的equals方法。
所以就叫出来的就不一样。
我是这么认为的仅供您参考! 不一定完全正确!

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
if(!al1.contains(it.next())), al1.add(it.next()); 这里面的两个it.next()已经不是同一个元素了,意思是如果all里面没有的话拔下一个元素添加进去。
Object obj=it.next(); if(!al1.contains(obj))  al1.add(obj);  而这一句用obj进行接收,添加的还是同一个元素。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
注意输出结果:第二个其实添加进去的是chy2 和 第一个集合中最后的那个chy1
[chy1, chy2, chy3, chy1]
[chy2, chy1]
为什么会出现这种情况呢?

6.png (16.1 KB, 下载次数: 46)

6.png

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
楼主进行了两次it.next()操作,当然会出错,all.contains(it.next())这是一次it.next()操作,all.add(it.next())这里又进行了一次,求给分

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马