Java ==和equals()的区别【详细版】

原创 2016年05月31日 06:34:45

==操作符专门用来比较变量的值是否相等。

比较好理解的一点是:
int a=10;
int b=10;
则a==b将是true。

但不好理解的地方是:
String a=new String("foo");
String b=new String("foo");
则a==b将返回false。

根据前一帖说过,对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是false。诚然,a和b所指的对象,它们的内容都是"foo",应该是“相等”,但是==操作符并不涉及到对象内容的比较。

对象内容的比较,正是equals方法做的事。

看一下Object对象的equals方法是如何实现的:
boolean equals(Object o){
    return this==o;
}

Object对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用equals和使用==会得到同样的结果。同样也可以看出,Object的equals方法没有达到equals方法应该达到的目标:比较两个对象内容是否相等。因为答案应该由类的创建者决定,所以Object把这个任务留给了类的创建者。

看一下一个极端的类:
Class Monster{
    private String content;
    ...
    boolean equals(Object another){ return true;}
}
我覆盖了equals方法。这个实现会导致无论Monster实例内容如何,它们之间的比较永远返回true。

所以当你是用equals方法判断对象的内容是否相等,请不要想当然。因为可能你认为相等,而这个类的作者不这样认为,而类的equals方法的实现是由他掌握的。如果你需要使用equals方法,或者使用任何基于散列码的集合(HashSet,HashMap,HashTable),请察看一下java doc以确认这个类的equals逻辑是如何实现的。 

Java面试宝典中是这样解释的

==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如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 方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。
版权声明:本文为芝麻软件工作室原创文章,未经芝麻软件工作室允许不得转载。

相关文章推荐

java equals和hashcode、==、的关系,使用区别详细

java中的==、equals()、hashCode()源码分析 在java编程或者面试中经常会遇到 == 、equals()的比较。自己看了看源码,结合实际的编程总结一下。1. ==   java...

java中equals和==的区别,写的很详细

对于equals和==的理解,记住这句话就行:==比较的是两个对象的地址是否相等,equals()比较的是两个对象中的内容是否相等 (这里的equals必须是复写了Object类中的equals()...

Java中的==和equals区别

  • 2013年01月30日 10:23
  • 15KB
  • 下载

java中equals和==的区别.doc

  • 2011年06月02日 09:49
  • 42KB
  • 下载

详细解释 hashcode equals() "==" 的区别和联系

最近 被  某某跟某某是否相等 给搞混了。。什么物理地址  哈希值   对象的 引用 巴拉巴拉一大堆 。。 先上几个结论  让没有时间的猿类 直接知道答案好了。: 结论就是: 1 如果两个对象相同...

java 资料 equals 与== 的区别

  • 2011年08月05日 21:36
  • 28KB
  • 下载

Java内存分配及equals和==号的详细讲解

从图中我们可以很清晰的看出,程序通过加载器从硬盘中

详解java中equals和== 的区别

先看一段代码:String test1 = "add"; String test2 = "add"; String test3 = new String("add"); String test4 = ...

Java 字符串比较操作符 == 与 equals 的区别

Java 在操作字符串时,经常涉及到比较两个字符串

JAVA中的equals和==的区别

== 比较的是指向的是不是相同相同的地址。 equals 比较的是值是不是相等 比如: (1) String a=new String("aa"); String b=new String(...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java ==和equals()的区别【详细版】
举报原因:
原因补充:

(最多只允许输入30个字)