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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 于星星 中级黑马   /  2012-7-25 00:38  /  2653 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java中“==”和“equals” 有什么区别,对象之间用“==”比较的是什么,字符串之间用“==”和“equals”分别比较的是什么

14 个回复

倒序浏览
==是比较的是2个对象的地址,而equals比较的是2个对象的内容。
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
  1. String a=new String("foo");

  2. 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方法的实现代码如下:
  1. boolean equals(Object o){

  2. return this==o;

  3. }
复制代码
这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

http://wenku.baidu.com/view/2d25e10d4a7302768e9939d7.html 这个是百度的文本解释,你可以看看,方便本科学生理解
希望可以帮到你。

点评

明显就是6楼 复制沙发的、  发表于 2012-7-25 23:12
一个帖子里同时出现两个完全相同的回复,你不觉得有点。。。  发表于 2012-7-25 23:04
谢谢 似乎是那么回事  发表于 2012-7-25 10:28
回复 使用道具 举报
equals比较的是两个引用类型的值是否相等;==比较的是内存地址是否相同,是绝对的相等比较,也可以比较引用类型
举个例子:
String a1=new String("aaa");
String a2=new String("aaa");
如果用equals比较,a1等于a2,他们俩的值都是aaa
如果用==比较,a1不等于a2,因为是两个不同的变量,内存地址不同
回复 使用道具 举报
值类型和引用类型
   值类型:int,float,byte,double,boolean,char等基本类型
   引用类型:String,一切对象(只要是new 出来的)
对于值类型来说是没有equals 方法的,只有引用类型之间才能用equals比较
equals 是引用类型的比较方法,但==也有能比较引用类型。
它们的区别在于:
              equals比较的是两个 引用类型的值是否相等;
       而==比较的是内存地址是否相同,是绝对的相等比较。

        例如:String a = new String("abc");String b = new String("abc");
                       new了两个引用类型的变量 a,b
                     equals比较:a和b是相等的,因为它们的值都是 abc;
                          ==比较:a和b是不等的,因为它们是声明的不同变量,它们指向的内存地址是不同的
                             相当于两个人只是长得一模一样,但门牌号不一样(可以这样理解);

特例:
                关于string的特例:
                      例如:String a = "abc";String b = "abc";
                              声明了两个引用类型变量a,b
              ==情况下,它们也是相当的,为什么呢?String也是引用类型为什么会相当呢?
             原因是因为java vm(虚拟机) 在处理String声明时,是先到内存池中找有没有相等的      
              有就指向它,没有就创建;因此两个String指向的是同一个地址,所以相等。

希望对你有帮助..........
回复 使用道具 举报
  ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

     如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如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-7-25 23:05
你回复的这些话你都明白吗?警告一次,希望你能自己努力。不好意思,不要怪我,这是我的职责  发表于 2012-7-25 22:56
回复 使用道具 举报
== 判断两个对象所引用的内存地址是否是相同
比如2个字符串对象
String s1 = new String("str");
String s2 = new String("str");
如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。
equals()比较的是对象的值,equals方法是从Object继承来的,Java中任何对象都自动有这个方法; 它是java.lang.Object类中的一个方法。因为java中所有的类都默认继承于Object,所以所有的类都有这个方法。

在Object类源码中是这样写的。
public boolean equals(Object obj) {
return (this == obj);
}

回复 使用道具 举报
本帖最后由 郑正华 于 2012-7-25 10:28 编辑

java中equals方法和“==”的区别:
equals 方法是 java.lang.Object 类的方法。
有两种用法说明:

(1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。“==”比较两个变量本身的值,即两个对象在内存中的首地址。“equals()”比较字符串中所包含的内容是否相同。比如:
String s1,s2,s3 = "abc", s4 ="abc" ;
s1 = new String("abc");
s2 = new String("abc");
那么:s1==s2 是 false //两个变量的内存地址不一样,也就是说它们指向的对象不 一样,故不相等。
s1.equals(s2) 是 true //两个变量的所包含的内容是abc,故相等。
注意(1):
如果: StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");
结果: s1.equals(s2) //是false
解释:StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,而Object类中的equals方法是用来比较“地址”的,所以等于false.
注意(2):
对于s3和s4来说,有一点不一样要引起注意,由于s3和s4是两个字符串常量所生成的变量,其中所存放的内存地址是相等的,所以s3==s4是true(即使没有s3=s4这样一个赋值语句)

(2)对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。
比如:
class A
{
A obj1 = new A();
A obj2 = new A();
}
那么:obj1==obj2是false
obj1.equals(obj2)是false
但是如加上这样一句:obj1=obj2;
那么 obj1==obj2 是true
obj1.equals(obj2) 是true
总之:equals方法对于字符串来说是比较内容的,而对于非字符串来说是比较其指向的对象是否相同的。== 比较符也是比较指向的对象是否相同的也就是对象在对内存中的的首地址。String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以是true。
回复 使用道具 举报
本帖最后由 郑正华 于 2012-7-25 10:30 编辑

关于equals与==的区别从以下几个方面来说:
(1)如果是基本类型比较,那么只能用==来比较,不能用equals
比如:
public class TestEquals {
public static void main(String[] args)
{
int a = 3;
int b = 4;
int c = 3;
System.out.println(a == b);//结果是false
System.out.println(a == c);//结果是true
System.out.println(a.equals(c));//错误,编译不能通过,equals方法
//不能运用与基本类型的比较
}
}
(2)对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。比如:
public class TestEquals {
public static void main(String[] args)
{ Integer n1 = new Integer(30);
Integer n2 = new Integer(30);
Integer n3 = new Integer(31);
System.out.println(n1 == n2);//结果是false 两个不同的Integer对象,故其地址不同,
System.out.println(n1 == n3);//那么不管是new Integer(30)还是new Integer(31) 结果都显示false
System.out.println(n1.equals(n2));//结果是true 根据jdk文档中的说明,n1与n2指向的对象中的内容是相等的,都是30,故equals比较后结果是true
System.out.println(n1.equals(n3));//结果是false 因对象内容不一样,一个是30一个是31
}
}
这是Integer的实例,如果是其他的比如Double、Character、Float等也一样。
(3)注意:对于String(字符串)、StringBuffer(线程安全的可变字符序列)、StringBuilder(可变字符序列)这三个类作进一步的说明。
(a)首先,介绍String的用法,请看下面的实例:
public class TestEquals {
public static void main(String[] args) {
String s1 = "123";
String s2 = "123";
String s3 = "abc";
String s4 = new String("123");
String s5 = new String("123");
String s6 = new String("abc");
System.out.println(s1 == s2);//(1)true
System.out.println(s1.equals(s2));//(2)true
System.out.println(s1 == s3);//(3)flase
System.out.println(s1.equals(s3));//(4)flase
System.out.println(s4 == s5);//(5)flase
System.out.println(s4.equals(s5));//(6)true
System.out.println(s4 == s6);//(7)flase
System.out.println(s4.equals(s6));//(8)flase
System.out.println(s1 == s4);//(9)false
System.out.println(s1.equals(s4));//(10)true
}
}
答案解释:s1与s2分别指向由字符串常量”123” 创建的对象,在常量池中,只有一个对象,内容为123,有两个引用s1和s2指向这个对象,故这两个引用变量所指向的地址是相同的,因而(1)处的运行结果为true,又因为s1.equals(s2)是比较s1和s2所指向的对象的内容是否相等,而我们知道这两个对象的内容都是字符串常量”123”,故标记(2)处的运行结果是true。
用同样的方法分析,s1和s3所指向的对象不一样,内容也不一样,故标记(3)和(4)处运行结果是false。
再看看s4和s5,这两个引用变量所指向的对象的内容都是一样的(内容都是123),但是这两个对象是用new操作符创建处类的,是在内存中分配两块空间给这两个对象的,因而这两个对象的内存地址不一样,故事两个不同的对象,标记(5)处的s4 == s5 运行结果为false,但是内容一样,故标记(6)处的s4.equals(s5)运行结果为true。同理,s4和s6所指向的对象地址不同,内容也不相同。故标记(7)(8)处运行结果为false。
s1和s4分别指向两个不同的对象(之所以这样称呼,是因为这两个对象在内存中的地址不相同,故而对象不相同),故标记为(9)处的s1 == s4运行结果为false,而标记为(10)处的s1.equals(s4)运行结果疑问:乍一看结果,有点惊讶,为什么不是true呢,不是说 equals方法是比较内容的吗?
解释:不错,如果在新类中被覆盖了equals方法,就可以用来比较内容的。但是在上面的例子中类Value并没有覆盖Object中的equals方法,而是继承了该方法,因此它就是被用来比较地址的,又v1和v2的所指向的对象不相同,故标记(1)处的v1.equals(v2)运行结果为false,标记为(2)处的v1 == v2运行结果也为false。
回复 使用道具 举报
罗宵 中级黑马 2012-7-25 22:48:01
9#
==比较运算符,你可以把它当作比较值的东西。像一般的数据的值比较。在对象中,它比较的是地址值,也是值的比较。
equals()是个方法。属于所有类的根类Object的。被所有类所继承。equals最原始的目的是比较对象的地址值。
在字符串中==还是比较两个字符串的地址值;
而字符串中的equals()方法被重写了,目的是比较两个字符串的内容是否相同。与地址值无关了;
如:String a=new String(abc);  String b=new String(abc);
则:a==b;的结果是false(分别new了两个对象,地址值不同);
a.equals(b)的结果是true(字符串的内容相同,所以就是true)。
回复 使用道具 举报
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
解释一下==号,他比较的是一个对象在内存中的地址值,
比如2个字符串对象
String s1 = new String("str");
String s2 = new String("str");
如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。
equals的情况比较复杂,它是java.lang.Object类中的一个方法。因为java中所有的类都默认继承于Object,所以所有的类都有这个方法。
在Object类源码中是这样写的。
public boolean equals(Object obj) {
return (this == obj);
}
他同样使用==号进行内存地址的比较。但是许多java类中都重写了这个方法,比如String。
public boolean equals(Object anObject) {
if (this == anObject) {
     return true;
}
if (anObject instanceof String) {
     String anotherString = (String)anObject;
     int n = count;
     if (n == anotherString.count) {
  char v1[] = value;
  char v2[] = anotherString.value;
  int i = offset;
  int j = anotherString.offset;
  while (n-- != 0) {
      if (v1[i++] != v2[j++])
   return false;
  }
  return true;
     }
}
return false;
    }
String里的方法,如果==号比较不相等,还会进行一下值的比较。
所以equals方法具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法,那么他和==号等价
回复 使用道具 举报
刘海源 发表于 2012-7-25 01:44
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要 ...

       这些话有的是我查资料的,但是我真的懂了,就是说不了这么专业,我觉的讲的挺好就给他发了,你不要误会,我会用我的技术说明的

点评

刘同学您好,如果别人写的好,其实转载别人资料是完全可取的,但是要记得附上资料的来源地址,或写上自己的总结体会,这样更好哦。  发表于 2012-7-25 23:44
回复 使用道具 举报
刘海源 发表于 2012-7-25 23:27
这些话有的是我查资料的,但是我真的懂了,就是说不了这么专业,我觉的讲的挺好就给他发了,你不 ...

我会关注你的,就因为内容相同的事,把沙发的评分给撤了,我感觉挺内疚,但是你说帖子相似还可以,,但是一字不差,未免有点太巧了吧,所以哥们你也别怪我,既然滔哥把论坛交给我了,我就得负责,我不能辜负了他,谢谢哥们的谅解。
回复 使用道具 举报
田向向 发表于 2012-7-25 23:48
我会关注你的,就因为内容相同的事,把沙发的评分给撤了,我感觉挺内疚,但是你说帖子相似还可以,,但是 ...

呵呵就是,就是,技术就的多交流才会知道真相,对了有哥们还问我为啥这么快拿了10多个技术分了,我告诉他我有基础的我学了一年多就是没学多好,但是差不多都知道些,看看视频就差不多了,你们不会误会我作弊吧
回复 使用道具 举报
刘海源 发表于 2012-7-25 23:27
这些话有的是我查资料的,但是我真的懂了,就是说不了这么专业,我觉的讲的挺好就给他发了,你不 ...

嗯嗯,知道了以后我会用我自己的白话文讲解给大家我,要脱离拐杖,谢谢了
回复 使用道具 举报
http://blog.csdn.net/wangbaokangfei/article/details/7745409#2302630
我博客里简要的介绍了一下操作符“==”与对象的equals()方法的用法.你可以参考下...
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马