黑马程序员技术交流社区

标题: equals方法和==有什么区别? [打印本页]

作者: yangfengxiao    时间: 2012-10-8 21:46
标题: equals方法和==有什么区别?
equals方法和==有什么区别?究竟有什么区别,我自己掰扯了半天也没弄明白反而越想越乱,希望各位大神帮帮忙!!
作者: 王中利    时间: 2012-10-8 22:03
我的理解比较简单,有不充分的地方:就是epuals()方法是比较字符串对象中的字符是否相等,而==运算符则比较两个对象引用是否指向同一个对象。
作者: 韩军博    时间: 2012-10-8 22:05
看就业面试宝典呀
作者: 翁鹏    时间: 2012-10-8 22:17
本帖最后由 翁鹏 于 2012-10-8 22:20 编辑

         == 运算符  如果比较的是基本数据类型的话,比较的是字面值。 如果比较的是对象的话,看两个引用是否引用同一个对象,即引用(地址值)是否一样。
        而 equals方法是在Object当中定义的。在不重新定义equals的前提下,Object中的equals方法和 == 运算符比较两个对象的效果是一样的,就是两个引用是否引用同一个对象,是的话返回true。
        所以,Object中的equals方法一般对我们没有什么用,因为我们一般想比较两个独立对象的状态是否相等。所以,一般在需要equals方法进行比较的时候,我们都要覆写Object中的equals方法。
        注意,覆写equals方法的时候一定要记得也覆写hashCode方法。
        
作者: 林志进    时间: 2012-10-8 22:17
== 比较变量所对应的"内存"中所存储的值是否相同。比较 基本类型的数据或者引用是否相等,只能用==操作。
equals是java.lang.Object类中的一个方法。因为java中所有的类都默认继承于Object,所以所有的类都有这个方法。
object 的equals 方法实际上就是使用==号进行内存地址的比较。但很多类重写这个方法,比如String,如果==不相等,还会进行下一值的比较。
所以equals方法具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法,那么他和==号等价。
作者: 徐传任    时间: 2012-10-8 22:20
首先,java中的equals方法的源码是这样实现的。
  1. public boolean equals(Object obj) {
  2.     return this==obj;
  3. }
复制代码
也就是说java中Object类中队equals方法也是通过==来判断的,就是判断是否指向了同一个对象,
所以如果不对equals方法进行重写的话,可以理解为==和equals方法一样,但是我们在一些类中可以根据类中具体的内容来判断两个对象是否相同,这时候就可以复写equals 方法来按照自己的属性就行判断,这时候就与==不同了。如定义一个Person类,里面有age,和name两个属性,这时候可以用age和name是否相等来判断是不是同一个人,所以就可以复写equals方法,这时就与==不同了
作者: y510662669    时间: 2012-10-8 22:22
简单点说:equals方法比较的是两个对象的内容是否相同,若有一个String str=“abc” 还有一个String str1="abc";则它们equals的返回值是true。String类重写了Object类的equals方法,至于具体它们是怎么比较的,这个你可以查看API文档。
==方法比较的是两个对象在内存中的引用是否相等,也就是它们在内存中的地址是否相当,String str1=new String(); String str=new String()。则它们==的返回值是false,对了String类是一个一句话产生两个对象。例如:String str=new String(“abc”); 则它们产生了两个对象,一个是str,str存在于栈内存中,有一个指针指向堆内存中真正的对象。一个是字符串"abc"对象,存在于常量池中。
我也不是什么大神,就是一个java菜鸟,说的地方可能有所欠缺。推荐楼主看毕老师的视频!
作者: 王虎    时间: 2012-10-8 22:24
"=="--------比较对象在内存中的地址
"equals"分情况:当没有重写equals方法时和“==”一样都是比较地址;当有重写方法时比较的是对象的属性值
另外对于字符串的比较一般用equals
作者: 王震阳老师    时间: 2012-10-8 22:27
自己曾经发过这样的帖子,给你一个链接你看看,自己写的不好,好的你可以看看大家的回复。http://bbs.itheima.com/thread-27100-1-1.html
作者: 王震阳老师    时间: 2012-10-8 22:28
自己曾经发过这样的帖子,给你一个链接你看看,自己写的不好,好的你可以看看大家的回复。http://bbs.itheima.com/thread-27100-1-1.html
作者: yangfengxiao    时间: 2012-10-8 22:42
王震阳 发表于 2012-10-8 22:28
自己曾经发过这样的帖子,给你一个链接你看看,自己写的不好,好的你可以看看大家的回复。http://bbs.ithei ...

谢谢,这个地址对我很有帮助,是在太谢谢你啦?
作者: 舒远    时间: 2012-10-10 12:03
==是很明确的比较对象地址是否相等。
equals不一定,Object中的equals方法比较的是当前对象和传入的对象地址是否相等,可以查看源码,就明白。
如果自己的类么有重写equals方法则该类继承Object中的equals方法,比较仍然是对象地址。如果重写了equals方法。则要看具体的实现了。
针对String:==仍旧比较两个字符串地址是否相等。equals则比较字符串实际内容是否相同。这些都可以查看源码来了解。
作者: 陈俊来    时间: 2012-10-10 12:07
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
String a=new String("foo");
String b=new String("foo");
两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals方法。
如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:
boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

作者: 聆听    时间: 2012-10-28 14:09
我面试期间总结的

== 是否同一个引用
equals 内容是否相同
String s1=“this”; String s2=“this”;  String s3=s1;

s1==s2   false 因为不是同一个对象,指向不同的地址
s1.equals(s2)  true 内容相同
s1==s3  true 指向同一个对象
作者: 罗力    时间: 2012-10-29 17:01
聆听 发表于 2012-10-28 14:09
我面试期间总结的

== 是否同一个引用

== 是指的基本数据或是两个引用变量指向同一个对象的相等 ,equals是指的堆内存中的两个对象相等。
作者: 奋斗的青春    时间: 2012-10-29 18:43
==是判断两个变量或实例是不是指向同一个内存空间
equals是判断两个变量或实例所指向的内存空间的值是不是相同

==是指对内存地址进行比较
squals()是对字符串的内容进行比较

==指引用是否相同
equals()指的是值是否相同

A.==操作符专门用来比较变量的值是否相等,由于变量名只是内存地址的引用名称,所以而不代表变量本身,
由此可知道变量的值指的是好像某一块内在地址,请看示例

Int intA=10;

Int intB=10;

int intArrA[]=new int[2];

        int intArrB[]=new int[2];

        for(int i=0;i<2;i++){

            intArrA[i]=0;

            intArrB[i]=0;

}

System.out.println("(intA==intB)="+(intA==intB));

System.out.println("(intArrA==intArrB)="+(intArrA==intArrB));

System.out.println("(intArrA[0]==intArrB[0])="+(intArrA[0]==intArrB[0]));

输出结果是:

(intA==intB)=true

(intArrA==intArrB)=false

(intArrA[0]==intArrB[0])=true

从结果可知, intArrA和intArrB是数组名称,故代表的是内存指针,所以上述结论在此可以通过,另外

因: intArrA[0],intArrB[0]分别在不同的地址,所以(intArrA[0]==intArrB[0])好像是在为false,但是intArrA[0],intArrB[0]分别仅仅是代表

地址所存储的内容,因此, (intArrA[0]==intArrB[0])应该为真.

故, ==操作符专门用来比较变量的”内容”或者”实质”是否相等的;

如:  intA的内容是10,intB的内容也是10所以intA和intB是相等的,

     intArrA的内容是一个int类型的数组内存区域, intArrB的内容也是一个int类型的数组内存区域,且长度相等,但是他们是并非是同 一内

在区域,而是在内存的两个不同地方,所以他们不相等

B. equals()方法

  equals() 方法是Object的方法,因为一切类的基类是Object方法,所以,equals方法一定存在于任何一个类里面,且用户在继承某一类并且重定

义该方法,此时equals方法的作用则于用户决定了,

但是,我们没有去定义它,我们的要定义的类的所有你类也没有重新定义它,那它的作用就和Object 的方法的一样了,因Object对象默认使用了==

操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用equals和使用==会得到同样的结果.

所以总结一句话, ==是”内容”(或实质),而equals是表象


==和equals()的区别用法
悬赏分:10 - 解决时间:2006-9-19 21:37
class A
{
int a=1;
}
class Appa
{
public static void main(String args[])
{
String s1,s2,s3,s4;
s1="abc";
s2="abc";
s3=new String("abc");
s4=new String("abc");
A obj1,obj2;
obj1=new A();
obj2=new A();
System.out.println("s1==s2:"+(s1==s2));
}
}
如果按资料上说的是==为引用,他们的引用不一样啊!输出应该是false啊!可是输出为true!大家顺便把==和equals()的区别用法说一下!
==指引用是否相同
equals()指的是值是否相同

字符串是特殊的~
字符串是对象,新建个“abc”的字符串的时候,系统会先到内存中找,看是否存在‘a’,‘b’,‘c’,如果存在,引用,不存在新建
所以你打出来的是true


作者: 孙松林    时间: 2012-10-29 19:50
"=="比较对象在内存中的地址
"equals"分情况:
1:当没有重写equals方法时和“==”一样都是比较地址;
2:当有重写方法时比较的是对象的属性值           另外对于字符串的比较一般用equals


作者: 任雷彬    时间: 2012-10-30 02:04
==和equals是两种比较变量是否相等的方式。
1.当使用==来判断时,如果两个变量是基本数据类型变量则只要两个变量的值相等,就能返回true。
如,int a =3; int  b=3;
       a==b   true;
2.对于两个引用性变量时,==和equals有所区别。
==要求引用型变量必须指向同一对象,不仅要地址相同,而对象相同。
equals方法是object类提供的一个实例方法,equals在判定两个对象相等的标准上与==没有区别。
但是equals方法在子类调用过程被复写,则判断标准会发生变化。
如: String str1= new String("java");
        String str2= new String("java");
           str1==str2;//false,引用类型地址不同
        str1.equals(str2);//true ,字符串内容相同。
所以在==于equals方法比较变量时,要具体对待。
作者: 陈军    时间: 2012-10-30 11:43
== 用于比较值,基本类型值都知道就不说了,
当比较引用变量时, 引用变量又是由对象的地址赋值的。 所以相当于比较内存地址

equals用于比较对象内容的,但在Object类中,源代码是这样的
public boolean equals(Object obj) {
        return (this == obj);
    }
所以如果自定义类不重写equals方法。不会比较对象的内容,而是直接用==比较内存地址值的。
所以当自定义类需要比较时,我们都会重写equals方法。
当然我们常用的类,很多都重写了equals方法,比如基本类型的包装类。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2