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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

代码基本含义:删除ArrayList中的重复元素,得到新的ArrayList,打印新的ArrayList
请教:Person类中的equals()方法是何时被调用的,是如何被调用的,和contain()方法有什么关系?
代码如下:[code=java]
[/code][code=java]import java.util.*;
class Person
{
        private String name;
        private int age;
        Person (String name, int age)
        {
                this.name=name;
                this.age=age;
        }

        public boolean equals(Object obj)
        {
                if(!(obj instanceof P erson))
                        return false;
                P erson p=(Person)obj;

                System.out.println(this.name+"                 "+p.name);
                return this.name.equals(p.name)&&this.age==age;
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
}


class ArrayListTest2
{
        public static void main(String[] args)
        {
               
        ArrayList al=new ArrayList();
                al.add(new Person("lisi01",30));
                al.add(new Person("lisi02",32));
                al.add(new Person("lisi02",32));
                al.add(new Person("lisi03",33));
                al.add(new Person("lisi04",35));
                al.add(new Person("lisi04",35));
               
               
        
                al=singleElement(al);
               
        

                Iterator it=al.iterator();
                while(it.hasNext())
                {
                        Person p=(Person)it.next();
                        sop(p.getName()+"     "+p.getAge());
                }


        }
        public static void sop(Object obj)
        {
               
                System.out.println(obj);
        }

        public static ArrayList singleElement(ArrayList al)
        {
                ArrayList newAl=new ArrayList();
                Iterator it=al.iterator();
                while(it.hasNext())
                {
                        Object obj=it.next();
                        if(!newAl.contains(obj))
                                newAl.add(obj);
                }
                return newAl;
        }
}[/code]
[ 本帖最后由 troyli1986 于 2011-08-29  19:55 编辑 ]

评分

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

查看全部评分

3 个回复

倒序浏览
我把你的代码稍微改了一下,修改的地方在equals方法中[code=java]
import java.util.*;
class Person {
private String name;
private int age;
Person(String name, int age) {
  this.name = name;
  this.age = age;
}
public boolean equals(Object obj) {
  if (!(obj instanceof Person))
   return false;
  Person p = (Person) obj;
  boolean isEquals = this.name.equals(p.name) && this.age == p.age;
  System.out.println(this.name + " : " + this.age + ".....equals....."
    + p.name + " : " + p.age + "  " + isEquals);
  return isEquals;
}
public String getName() {
  return name;
}
public int getAge() {
  return age;
}
}
class ArrayListTest2 {
public static void main(String[] args) {
  ArrayList al = new ArrayList();
  al.add(new Person("lisi01", 30));
  al.add(new Person("lisi02", 32));
  al.add(new Person("lisi02", 32));
  al.add(new Person("lisi03", 33));
  al.add(new Person("lisi04", 35));
  al.add(new Person("lisi04", 35));
  al = singleElement(al);
  Iterator it = al.iterator();
  while (it.hasNext()) {
   Person p = (Person) it.next();
   sop(p.getName() + " " + p.getAge());
  }
}
public static void sop(Object obj) {
  System.out.println(obj);
}
public static ArrayList singleElement(ArrayList al) {
  ArrayList newAl = new ArrayList();
  Iterator it = al.iterator();
  while (it.hasNext()) {
   Object obj = it.next();
   if (!newAl.contains(obj))
    newAl.add(obj);
  }
  return newAl;
}
}[/code]以下是控制台输出的结果:

lisi02 : 32.....equals.....lisi01 : 30  false
lisi02 : 32.....equals.....lisi01 : 30  false
lisi02 : 32.....equals.....lisi02 : 32  true
lisi03 : 33.....equals.....lisi01 : 30  false
lisi03 : 33.....equals.....lisi02 : 32  false
lisi04 : 35.....equals.....lisi01 : 30  false
lisi04 : 35.....equals.....lisi02 : 32  false
lisi04 : 35.....equals.....lisi03 : 33  false
lisi04 : 35.....equals.....lisi01 : 30  false
lisi04 : 35.....equals.....lisi02 : 32  false
lisi04 : 35.....equals.....lisi03 : 33  false
lisi04 : 35.....equals.....lisi04 : 35  true
lisi01 30
lisi02 32
lisi03 33
lisi04 35


从结果结果可以分析出出,equals方法是在 contains方法调用后调用的,
       刚开始的时候,集合中没有元素,所以就不用判断该要加的元素(即al.add(new Person("lisi01", 30));)是否和集合中的equals,
       当第二个元素("lisi02", 32));要加入的时候,它先和集合中的已有元素(("lisi01", 30));)进行比较,由于你定义的equals方法中判断2个对象是否相等的条件是姓名和年龄都相等,这时2个对象才相等,
       当第三个元素("lisi02", 32));要加入时,就要和前面2个元素进行比较,由于姓名和年龄都和第二个元素相等,所以比较的结果是true,因此无法加入
      后面的元素以此类推
      所以最后只有4个元素加到了集合中
[ 本帖最后由 黄敏文 于 2011-08-31  08:27 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 不错哦!

查看全部评分

回复 使用道具 举报
其实关于contains()方法和equals方法的关系,最好的方式而是应当去看API
我先把API上List接口中contains()方法的说明贴上来吧:

boolean contains(Object o)
  如果列表包含指定的元素,则返回 true。更确切地讲,当且仅当列表包含满足 (o==null ? e==null : o.equals(e)) 的元素 e 时才返回 true。


也就是说,在调用contains方法时,会首先判断传入的对象是否为空
如果传入的对象不为空,则调用传入对象的equals()方法和集合中的每一个元素进行比较
只要在比较的过程中有任何一次的返回值为true的话,那么contains方法就返回true,否则返回false
知道了上面这一点,下面就看一下Person类中的equals()方法是如何被调用的吧:
首先看你这一段代码:
while(it.hasNext()) {
    Object obj = it.next();
    if(!newAl.contains(obj)) {
      newAl.add(obj);
    }
}
看到被标红的部分了吗?现在就结合上面所说的解释一下这里吧
首先,假设我们现在已经循环到了al中的第三个元素,也就是第二个Person("lisi02",32)处
由于在被标红的地方中,我们将这个Person作为Object参数传进contains方法中去了(此处为向上转型)
于是,List就会首先判断它是不是为空,肯定不为空
然后,List就会调用这个Object类的equals方法(实际上也就是Person类的equals方法),将List中的第一个元素传进去,也就是Person("lisi01", 30),很显然会返回false;然后List就会继续将第二个的元素传进去,也就是Person("lisi02",32),这时就会返回true。
于是这个contains方法就会返回true,这个Person就不会被放到newAl中去
[ 本帖最后由 李叶 于 2011-08-29  20:47 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 回答的很好!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-8-31 00:24:41
板凳
debug一下或者查看源代码不就可以了么==
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马