黑马程序员技术交流社区
标题:
问题:"=="和equals方法的区别!
[打印本页]
作者:
王海飞
时间:
2011-7-17 22:28
标题:
问题:"=="和equals方法的区别!
"=="和equals方法 到低有什么区别?
作者:
匿名
时间:
2011-7-17 22:45
==是java内置的,可以理解为[color=Red]相同[/color]。==的比较分两种:一种是比较基本数据类型,例如int,那么比较的就是基本数据类型的值;
如果比较的是对象,例如String,那么比较的是两个句柄是否指向内存中的同一个对象。!
.equals()是Object的方法,可以理解为[color=Red]相等[/color] 。显然两个object相等并不意味着相同;但是需要注意的是,也并不意味着他们对应内存区域的所有字节都相等,比如(但不限于这个原因)他们内部可能还有自己的引用。所以,两个对象是否相等,只有这个对象自己才知道如何判断,java并不知道。所以就需要该类自己提供一个equals方法。
作者:
匿名
时间:
2011-7-17 22:51
首先==是比较运算符,比较的主体可以是基本数据类型的变量,常量,也可以是引用数据类型,如对象。
而equals是Object类中的方法,比较的主体是对象,其作用是判断两个引用指向的对象是否为同一个,也就是说他们是否指向了堆内存中的同一片地址空间,再说的彻底点,就是两个引用所对应的内存地址值是否一样。
如果==用来比较对象,效果应该和equals类似。
作者:
匿名
时间:
2011-7-18 07:28
equals()方法只能比较引用类型,“==”可以比较引用类及基本类型;
举个例子[code]class mytest
{
private int d,m,y;
public mytest(int d,int m,int y)
{
this.d=d;
this.m=m;
this.y=y;
}
}
public class EqualsTest
{
public static void main(String[] args)
{
mytest t1=new mytest(1,1,2011);
mytest t2=new mytest(1,1,2011);
if(t1==t2)
{
System.out.println("t1==t2");
}
else
{
System.out.println("t1!=t2");
}
if(t1.equals(t2))
{
System.out.println("t1 is equals to t2");
}
else
{
System.out.println("t1 is not equals to t2");
}
t2=t1;
if(t1==t2)
{
System.out.println("t1==t2");
}
else
{
System.out.println("t1!=t2");
}
}
}[/code]运行结果:
t1!=t2
t1 is not equals to t2
t1==t2
因为 我们的t1和t2中存储的分别是对象的地址。首地址肯定是不相同的。
执行完了equals()方法之后 t1等于t2
equals()比较的是对象的内容。所以一开始附的初始值 是一样的。
作者:
匿名
时间:
2011-7-18 09:09
什么时候用“==”、“=”、“equals”
当比较[color=Red]值类型[/color]的时候,
(整、浮点、布尔)用“==”
赋值用“=”
其他的用equals
当比较[color=Red]对象[/color]的时候,
判断两个对象引用是否相同用“==”
赋值语句用“=”
判断两个对象内容是否相同用equals
PS:判断两个对象内容是否相同,虽然使用的是equals方法,但是这个方法一般是是覆盖Object中的equals方法,假如没有覆盖equals方法的话,就没有判断内容是否相同的功能。如String就覆盖了equals方法,但是StringBuffer却没有覆盖equals方法。
作者:
匿名
时间:
2011-7-18 10:06
==比较的是是不是同一个对象!equals方法一般比较的是不是同一个类,然后比较参数是否相同。当然具体判定还需要看equals方法中的具体代码
作者:
匿名
时间:
2011-7-18 10:35
使用==来判断两个变量是否相等,如果2个变量是[color=Red]基本类型的变量[/color],且都是数值型(不一定要求数据类型严格相同),则只要两个变量的值相等,使用==判断就返回true
但对于两个引用类型的变量,必须他们指向一个对象,==才会返回true,==不可比较类型上没有父子关系的两个对象
如下:[code=java]package cn.itcast.zhanjc;
/**
* Description:
*
*/
public class TestEqual
{
public static void main(String[] args)
{
int it = 65;
float fl = 65.0f;
//将输出true
System.out.println("65和65.0f是否相等?" + (it == fl));
char ch = 'A';
//将输出true
System.out.println("65和'A'是否相等?" + (it == ch));
String str1 = new String("hello");
String str2 = new String("hello");
//将输出false
System.out.println("str1和str2是否相等?" + (str1 == str2));
//将输出true
System.out.println("str1是否equals str2?" + (str1.equals(str2)));
}
}[/code]所以很多时候,程序判断两个引用变量是否相等的时候,是希望一种类似于值相等的判断规则,并不要求这两个引用是不是指向一个对象,例如上面程序中的两个字符串对象,需要他们引用字符串对象包含的字符串序列即可相等,这就需要equals。
注:Object类提供的equals方法和==方法符合没有区别,如下为Object中equals方法,可见他和==无区别[code=java] public boolean equals(Object obj) {
return (this == obj);
}[/code]所以我们在使用这个方法采用自定义的相等标准,重写这个方法
我们在重写equals方法的时候,会判断需要比较的对象和调用这个方法的对象是否相等时时在这两个对象是同一个类的实例的基础上
但是由于instanceof运算份特殊性,当前面对象是后面类的实例或者他子类的实例都将返回true,所以我们最好用[color=Red]两个类的字节码来判断是否为同一个类的实例[/color],并且当两个对象是同一个对象的时候直接返回true,[code=java]package cn.itcast.zhanjc;
//定义一个Person类
class Person
{
private String name;
private String idStr;
public Person(){}
public Person(String name , String idStr)
{
this.name = name;
this.idStr = idStr;
}
//下面省略name和idStr的setter和getter方法。
.........
//重写equals方法,提供自定义的相等标准
public boolean equals(Object obj)
{
//待比较的两个对象是同一个对象,直接返回true
if(this == obj)
{
return true;
}
//只有当obj是Person对象
if (obj != null && obj.getClass() == Person.class)
{
Person personObj = (Person)obj;
//并且当前对象的idStr与obj对象的idStr相等才可判断两个对象相等
if (this.getIdStr().equals(personObj.getIdStr()))
{
return true;
}
}
return false;
}
}[/code]
作者:
匿名
时间:
2011-7-18 16:59
标题:
回复 楼主 的帖子
equals是比较不同的两个对象的值是不是相等
== 是比较相同的两个对象的值是不是相等
值类型是存储在内存中的堆栈,而是引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同
equals操作表示的两个变量是否是对于同一个对象的引用,即堆中的内容是否相同
总之,==比较的是两个对象的地址,而equals比较的是两个对象的内容
显然,当equals为true时,==不一定为true
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2