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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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是对象的方法。

点评

如果使用this.name==p.name 这样比较的是地址值的话 那么必须使用String类复写Object类的equals方法 这点理解 那么为什么后面this.age==p.age不能使用equals方...  发表于 2012-7-17 14:29

评分

参与人数 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,多了个判定条件来判断是否是同一元素。
回复 使用道具 举报
还有问题吗?
回复 使用道具 举报
学习一下。
回复 使用道具 举报
程潇 中级黑马 2012-7-17 18:37:56
9#
你的问题涉及到==和equals的区别,这个题目在面试中很常见
总结如下:
==
1.==用来比较两个变量的值是否相等
2.可用于比较基本数据类型,也可以比较两个引用变量
3.如果比较两个基本数据类型,比较的就是基本数据类型的值
4.如果比较的是对象类型,那么就涉及了两块内存,对象本身占用一块内存(堆内存),指向对象的变量也占用一块内存。
    例如:Object obj = new Object(); 变量obj是一个内存,new Object()是另一个内存。此时,变量obj对应内存中的值就是对象所在内存的首地址。如果要比较两个指向对象的变量是否指向同一个对象,即这两个变量所对应的内存中的数值是否相等,就用==。

equals
1.equals用于比较两个对象的内容是否相同
2.不用来比较基本数据类型,字符串的比较基本上都是使用equals方法
    例子:String a = new String("string");
              String b = new String("string");
    两个new创建了两个对象,变量a和b分别指向了其中一个对象,由于这是两个不同的对象,所以他们的地址是不同的,即a和b存储的数值是不相同的。所以a==b的返回值就是false。但是这两个对象的内容是相同的,所以a.equals(b)的返回值就是true。
3.如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法代码如下。
            boolean equals(Object o){ return this == o; }
可以看到Object类的equals方法就是使用的==,比较的是两个变量指向的对象是否是同一对象。如果希望比较两个对象的内容是否相同,就必须覆盖equals方法。


掌握了以上知识点,再来看你的题目
this.name.equals(p.name) && this.age==p.age
1.this.name和p.name都是字符串,由于字符串String类重写了equals方法,比较的是两个字符串的内容,所以这里this.name.equals(p.name)比较的就是两个字符串内容是否相同。
2.this.age和p.age都是int型数据,是基本类型的数据,用==操作符比较,比较的是他们的值
3.整句话的意思就是两个对象的名字相同并且年龄也相同






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