黑马程序员技术交流社区

标题: 关于ArrayLIst集合调用equals问题 [打印本页]

作者: 张然龙    时间: 2014-5-9 11:41
标题: 关于ArrayLIst集合调用equals问题
本帖最后由 张然龙 于 2014-5-9 18:25 编辑

如注释所描述的 ,为什么取反就调用了Person中的equals方法,不取反就不会调用equals??

代码如下↓

  1. class Person
  2. {
  3.         int age;
  4.         String name;
  5.         Person(String name,int age)
  6.         {
  7.                 this.name=name;
  8.                 this.age=age;
  9.         }
  10.         public String getName()
  11.         {
  12.                 return name;
  13.         }
  14.         public int getAge()
  15.         {
  16.                 return age;
  17.         }
  18.         public boolean equals(Object obj)
  19.         {
  20.                 Person per=(Person)obj;
  21.                 System.out.println("进行了equals比较");//这个地方为什么一次都没读过?????
  22.                 return this.name.equals(per.getName())&&this.age==per.getAge();
  23.         }
  24. }
  25. class Single
  26. {
  27.         ArrayList<Person> al1=new ArrayList<Person>();
  28.         public  ArrayList<Person> method(ArrayList<Person> a)
  29.         {
  30.                 for (Iterator<Person> it = a.iterator(); it.hasNext();)
  31.                 {
  32.                         Person per =(Person)it.next();
  33.                         if(al1.contains(per))//这个地方不用!取反,按理来说也会读到Person类中的覆盖方法equals的啊?
  34.                         {
  35.                                 al1.add(per);
  36.                         }
  37.                 }
  38.                 return al1;
  39.         }
  40. }
  41. class Demo4
  42. {
  43.         public static void main(String[] args)
  44.         {
  45.                 ArrayList<Person> al=new ArrayList<Person>();
  46.                 al.add(new Person("1",10));
  47.                 al.add(new Person("1",10));
  48.                 al.add(new Person("1",10));
  49.                 al.add(new Person("1",10));
  50.                 al.add(new Person("1",10));
  51.                 al=new Single().method(al);
  52.                 System.out.println(al);
  53.         }
  54. }
复制代码

作者: 张然龙    时间: 2014-5-9 17:26
都没大神回答我.......
作者: Yov正    时间: 2014-5-9 17:48
这应该是涉及到jvm的是如何实现contains的。据我测试数组是空的时候就不会调用equals了。
if (true)
                        {
                                //al1.add(per);//此句话加上或不加上就能看出效果
                                al1.contains(per);

                        }
作者: 张然龙    时间: 2014-5-9 18:08
将add注释掉就不会比较equals,难道contains还要调用add??  太假了吧??
作者: 张然龙    时间: 2014-5-9 18:19
raikecody 发表于 2014-5-9 18:03
不用"!",一样能读到equals没错的,我编译了好几回,结果都是一样的
以下是我找到的contains方法的源代码, ...

我知道问题出哪里了。。。。。

我的al1值是null的  他就不进行equals比较了。。。。。。:Q:Q:Q:Q:Q:Q
作者: 张然龙    时间: 2014-5-9 18:24
归根结底就是我的al1是null  不调用equals,和equals半毛钱关系都没有。。。。:L
作者: 名字难取    时间: 2014-5-9 18:37
顶个啊啊啊啊啊啊啊啊啊啊啊啊啊
作者: hx小龙    时间: 2014-5-9 20:01
用了泛型了迭代的时候怎么还强制类型转换去了?嘿嘿




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