黑马程序员技术交流社区
标题:
谁帮我解释下 为什么这么写啊 比较的是什么
[打印本页]
作者:
王薇熔
时间:
2012-7-17 14:11
标题:
谁帮我解释下 为什么这么写啊 比较的是什么
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 比较的是?
}
}
作者:
黑马刘涛
时间:
2012-7-17 14:22
本帖最后由 黑马刘涛 于 2012-7-17 16:37 编辑
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 比较的是?
}
}
复制代码
//相信楼主已经看过集合的视频了吧。学生类复写了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是对象的方法。
作者:
王龙彪
时间:
2012-7-17 14:22
return this.name.equals(p.name) && this.age==p.age; //为什么这里这么写啊 name.equals(p.name) 和 age==p.age 比较的是?
复制代码
这个类的功能是将数据存到ArrayList,然后去除重复的对象的.
在ArrayList里存入自定义对象的时候
你问的这个地方正好是重写equals()函数的内容
这里的意思判断名字和年龄是否都一样
如果不这么写
如果不重写equals()函数
那么ArrayList会自动调用equals()函数
然后就会自动比较两个对象的地址值,这样就不可能去掉重复的对象了.
作者:
黑马刘涛
时间:
2012-7-17 15:04
如果使用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:35
本帖最后由 黄丽慧 于 2012-7-17 16:36 编辑
楼主,这里会使用两种方式,涉及到的是==和equal的定义和区别
name.equals(p.name)这里的name是字符串,我们需要比较的是这两个对象的名字是否相同,即两个name字符串内容是否相同
age==p.age比较的是age是否相同,age是int类型的,此时如果使用equal来进行比较的话,比较的是这两个变量指向的对象是否相同——这里很显然是不相同的,因此如果使用equal的话,返回的值肯定是不相同,达不到函数所要的比较效果。而使用==,比较的就是这两个age变量是否指向同一个数值,这样就能达到想要的比较效果了。
作者:
杨康
时间:
2012-7-17 16:51
因为在楼主这个例子中,学生对象的名字已经不存在重名的情况,所以最后比较的话可以直接用this.name.equals(p.name)
如果该对象中的个体,有重名的情况,年龄不相同,这时候就只用this.name.equals(p.name)方法已经不能判断两个是否是相同元素,所以后面加上了this.age==p.age,多了个判定条件来判断是否是同一元素。
作者:
黑马刘涛
时间:
2012-7-17 17:45
还有问题吗?
作者:
黄一—一
时间:
2012-7-17 18:05
学习一下。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2