黑马程序员技术交流社区

标题: 没整明白person中定义equals,没看到调用啊。就进行了重复... [打印本页]

作者: nerveva2000    时间: 2014-10-15 17:32
标题: 没整明白person中定义equals,没看到调用啊。就进行了重复...
本帖最后由 nerveva2000 于 2014-10-15 20:11 编辑

下面着个问题,我转不过来那个弯,在Person类中定义equals,没看到调用就进行了重复项排除了。
  1. <font size="2">/*
  2. 将自定义对象作为元素存到ArrayList集合中,并去除重复元素
  3. 比如:存人对象,同姓名,同年龄,视为同一个人,为重复元素。
  4. 思路
  5. 1对人描述,将数据封装进人对象
  6. 2定义容器,将人存入
  7. 3取出
  8. */
  9. import java.util.*;
  10. class Person
  11. {
  12.         private String name;
  13.         private int age;
  14.         Person(String name,int age)
  15.         {
  16.                 this.name= name;
  17.                 this.age= age;
  18.         }
  19.         public boolean equals(Object obj)
  20.         {
  21.                 if(!(obj instanceof Person))
  22.                         return false;

  23.                 Person p= (Person)obj;
  24.                 return this.name.equals(p.name)&& this.age == p.age;
  25.         }
  26.         public String getName()
  27.         {
  28.                 return name;
  29.         }
  30.         public int getAge()
  31.         {
  32.                 return age;
  33.         }
  34. }

  35. class Test
  36. {
  37.         public static void main(String[] args)
  38.         {
  39.                 ArrayList al = new ArrayList();

  40.                 al.add(new Person("lisi01",30));
  41.                 al.add(new Person("lisi02",35));
  42.                 al.add(new Person("lisi03",32));
  43.                 al.add(new Person("lisi02",35));
  44.                 al.add(new Person("lisi03",32));
  45.                 al.add(new Person("lisi04",31));

  46.                 al=singleElement(al);

  47.                 Iterator it = al.iterator();

  48.                 while (it.hasNext())
  49.                 {
  50.                         Person p = (Person)it.next();
  51.                         sop(p.getName()+"---"+p.getAge());
  52.                 }
  53.         }

  54.         public static ArrayList singleElement(ArrayList al)
  55.         {
  56.                 //定义一个临时容器
  57.                 ArrayList newAl = new ArrayList();
  58.                 Iterator it =al.iterator();
  59.                
  60.                 while (it.hasNext())
  61.                 {
  62.                         Object obj = it.next();
  63.                         if (!newAl.contains(obj))
  64.                                 newAl.add(obj);
  65.                 }
  66.                 return newAl;
  67.         }

  68.         public static void sop(Object obj)
  69.         {
  70.                 System.out.println(obj);
  71.         }
  72. }</font>
复制代码






作者: 小爷邱烙    时间: 2014-10-15 18:12
下面是contains方法的底层代码

  1. public boolean contains(Object o) {
  2.         return indexOf(o) >= 0;
  3.     }
  4.     public int indexOf(Object o) {
  5.         if (o == null) {
  6.             for (int i = 0; i < size; i++)
  7.                 if (elementData[i]==null)
  8.                     return i;
  9.         } else {
  10.             for (int i = 0; i < size; i++)
  11.                 if (o.equals(elementData[i]))    //调用参数的equals方法
  12.                     return i;
  13.         }
  14.         return -1;
  15.     }
复制代码




作者: dreamseekerkun    时间: 2014-10-15 19:07
调用contains底层就调用了,看不到的,不信,你在equals里加一句语句
作者: nerveva2000    时间: 2014-10-15 19:39
dreamseekerkun 发表于 2014-10-15 19:07
调用contains底层就调用了,看不到的,不信,你在equals里加一句语句

嗯,刚才又看了一遍那个地方的视频,确实如此,弄得这么隐蔽。多谢多谢!
作者: nerveva2000    时间: 2014-10-15 19:40
小爷邱烙 发表于 2014-10-15 18:12
下面是contains方法的底层代码

哦,原来是使用contains事,默认调用equals。。。怪不得找不到明码中哪里使用到了equals。谢谢
作者: 不再上网    时间: 2014-10-16 09:57
contains隐式的调用了对象的equals方法




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