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

import java.util.*;
class ArrayListDemo
{
  public static void main(String[] a)
  {
    ArrayList ali = new ArrayList();
    ali.add(new Person("abc1",21));
    ali.add(new Person("abc2",22));
    ali.add(new Person("abc2",22));
    ali.add(new Person("abc2",22));
    ali.add(new Person("abc1",21));
    ali.add(new Person("abc1",21));
    ali.add(new Person("abc2",22));
    ali.add(new Person("abc1",21));
    ali.add(new Person("abc2",22));
    System.out.println(ali);
   
    ali=getSingleElement(ali);
    System.out.println(ali);
   
  }
  public static ArrayList getSingleElement(ArrayList ali)
  {
    ArrayList temp = new ArrayList();
    Iterator it = ali.iterator();
    while(it.hasNext())
    {
      Object obj = it.next();
      if(!temp.contains(obj))
        temp.add(obj);
    }
    return temp;
  }
   
}
class Person
{
  private String name;
  private int age;
  Person(String name,int age)
  {
    this.name=name;
    this.age=age;
  }
  public String getName()
  {
    return name;
  }
  public int getAge()
  {
    return age;
  }
  public String toString()
  {
    return name+"::"+age;
  }
  public boolean equals(Object obj)
  {
    if(!(obj instanceof Person))
      throw new ClassCastException("类型不匹配");
    Person p=(Person)obj;
    return this.name.equals(p.name) && this.age==p.age; //为什么这里这么写啊  name.equals(p.name) 和 age==p.age 比较的是?
  }
}

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

8 个回复

倒序浏览
本帖最后由 黑马刘涛 于 2012-7-17 16:37 编辑
  1.   public boolean equals(Object obj)
  2.   {
  3.     if(!(obj instanceof Person))
  4.       throw new ClassCastException("类型不匹配");
  5.     Person p=(Person)obj;
  6.     return this.name.equals(p.name) && this.age==p.age; //为什么这里这么写啊  name.equals(p.name) 和 age==p.age 比较的是?
  7.   }
  8. }
复制代码
//相信楼主已经看过集合的视频了吧。学生类复写了equals 方法,该方法的目的是比较姓名和年龄相同的同学是同一个人,this.name.equals(p.name),this.name是调用该方法实例对象的姓名,是一个字符串,p.name是实际参数对象的的姓名,字符串复写了超类Object类的equals方法,能够比较两个字符串内容是否相等。this.age == p.age比较的就是两个学生对象的年龄,属于基本数据类型int 类型值比较。&& 要求两边都为true才为true,从而判断两个同学是不是一个人。这样说很清楚了吧?

如果使用this.name==p.name 这样比较的是地址值的话 那么必须使用String类复写Object类的equals方法这点理解 那么为什么后面this.age==p.age不能使用equals方...
//this.name==p.name 比较的不是地址值,比较的是两个字符串的值内容。Object类的equals方法比较的才是两个对象的地址值
public boolean equals(Object obj){
      return this == obj;
}
这就是为什么字符串要复写equals的原因
基本数据类型比较只有 == ,equals是对象的方法。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1. return this.name.equals(p.name) && this.age==p.age; //为什么这里这么写啊  name.equals(p.name) 和 age==p.age 比较的是?
复制代码
这个类的功能是将数据存到ArrayList,然后去除重复的对象的.
在ArrayList里存入自定义对象的时候

你问的这个地方正好是重写equals()函数的内容
这里的意思判断名字和年龄是否都一样
如果不这么写
如果不重写equals()函数
那么ArrayList会自动调用equals()函数
然后就会自动比较两个对象的地址值,这样就不可能去掉重复的对象了.
回复 使用道具 举报
如果使用this.name==p.name 这样比较的是地址值的话 那么必须使用String类复写Object类的equals方法这点理解 那么为什么后面this.age==p.age不能使用equals方...
//this.name==p.name 比较的不是地址值,比较的是两个字符串的值内容。Object类的equals方法比较的才是两个对象的地址值
public boolean equals(Object obj){
      return this == obj;
}
这就是为什么字符串要复写equals的原因
基本数据类型比较只有 == ,equals是对象的方法。
回复 使用道具 举报
本帖最后由 黄丽慧 于 2012-7-17 16:36 编辑


楼主,这里会使用两种方式,涉及到的是==和equal的定义和区别

name.equals(p.name)这里的name是字符串,我们需要比较的是这两个对象的名字是否相同,即两个name字符串内容是否相同

age==p.age比较的是age是否相同,age是int类型的,此时如果使用equal来进行比较的话,比较的是这两个变量指向的对象是否相同——这里很显然是不相同的,因此如果使用equal的话,返回的值肯定是不相同,达不到函数所要的比较效果。而使用==,比较的就是这两个age变量是否指向同一个数值,这样就能达到想要的比较效果了。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
因为在楼主这个例子中,学生对象的名字已经不存在重名的情况,所以最后比较的话可以直接用this.name.equals(p.name)
如果该对象中的个体,有重名的情况,年龄不相同,这时候就只用this.name.equals(p.name)方法已经不能判断两个是否是相同元素,所以后面加上了this.age==p.age,多了个判定条件来判断是否是同一元素。
回复 使用道具 举报
还有问题吗?
回复 使用道具 举报
学习一下。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马