Java中"equals"和"=="的区别

转载 2007年09月15日 14:43:00

转自:http://www.javaresearch.org/html/article/46110.htm

一句话概括:==比较的是两个对象的引用(即内存地址)是否相等,而equals()比较的是两个对象的值(即内存地址里存放的值)是否相等。当然equals()在个别类中被重写了那就例外了。

详细论述:eqauls 与 = =之异同

1)比较方式角度:

= =是面向过程的操作符;equals是面向对象的操作符

= =不属于任何类,equals则是任何类(在Java中)的一个方法;

我们可以1)Primitive1 (基本类型)= = Primitive2(基本类型);

         2)Object Reference1(对象引用)= = Object Reference2(对象引用)

         3)Object Reference1 (对象引用) .equals(Object Reference2 (对象引用))

           这三种比较

           但却不能Primitive1 (基本类型).equals( Primitive2(基本类型));

 对于基本类型,没有面向对象中发送消息一说,自然也不会有

方法成员。

 

2)比较目的角度:

1)    如果要比较两个基本类型是否相等,请用= =;

2)    如果要比较两个对象引用是否相等,请用= =;

3)    如果要比较两个对象(逻辑上)是否一致,请用equals;

 

对两个对象(逻辑上)是否一致的阐释:

   有人会问:在C++中, 比较两个对象相等不是也可以用==吗?我知道您是指运算符重载,但是很遗憾,Java中不支持运算符重载(java中亦有重载过运算符,他们是“+”,“+=”,不过也仅此两个,而且是内置实现的);所以,对象的是否相等的比较这份责任就交由  equals()来实现 。    

这个“逻辑上”其实就取决于人类的看法,实际开发中,就取决于用户的需求;


第三节:equals()缘起:

        equals()是每个对象与生俱来的方法,因为所有类的最终基类就是Object(除去Object本身);而equals()是Object的方法之一。

        我们不妨观察一下Object中equals()的source code:

         public boolean equals(Object obj) {

                      return (this == obj);

          }

        注意 “return (this == obj)”

        this与obj都是对象引用,而不是对象本身。所以equals()的缺省实现就是比较

        对象引用是否一致;为何要如此实现呢? 前面我们说过:对象是否相等,是由我们的需求决定的,世界上的类千奇百怪(当然,这些类都是我们根据模拟现实世界而创造的),虽然Object是他们共同的祖先,可他又怎能知道他的子孙类比较相等的标准呢?但是他明白,任何一个对象,自己总是等于自己的,何谓“自己总是等于自己”呢,又如何判断“自己总是等于自己”呢?一个对象在内存中只有一份,但他的引用却可以有无穷多个,“对象自己的引用1=对象自己的引用2”,不就能判断“自己总是等于自己”吗?所以缺省实现实现自然也就是

        “return (this == obj)”;

        而到了我们自己编写的类,对象相等的标准由我们确立,于是就不可避免的要覆写

        继承而来的public boolean equals(Object obj);

        如果您有过编覆写过equals()的经验(没有过也不要紧),请您思考一个问题:

         “两个对象(逻辑上)是否一致”实际上是比较什么?没错,或许您已脱口而出:

       就是对象的属性(即field,或称数据成员)的比较。方法是不可比较的哦。(这个问题是不是有些弱智呢?哈哈)

 第四节:对一个推论的思考

推论如下:一言以蔽之:欲比较栈中数据是否相等,请用= =;

                      欲比较堆中数据是否相等,请用equals; 

因为(根)基本类型,(根)对象引用都在栈中; 而对象本身在堆中;

         这句话又对又不对,问题出在哪,就是“数据”二字,先看栈中,数据或为基本类型,或为对象引用,用==比较当然没错;但是堆中呢?对象不是堆中吗?不是应该用equals比较吗?可是,我们比较的是堆中“数据”,堆中有对象,对象由什么构成呢?可能是对象引用,可能是基本类型,或两者兼而有之。如果我们要比较他们,该用什么呢,用”equals()”?不对吧,只能是”= =”!所以正确的结论是:欲比较栈中数据是否相等,请用= =; 欲比较堆中数据是否相等,请用equals;

因为(根)基本类型,(根)对象引用都在栈中(所谓“根”,指未被任何其他对象所包含); 而对象本身在堆中。 

Java中的==和equals区别

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

java中equals和==的区别.doc

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

Java面试题之==和equals的区别

在java程序设计中,经常需要比较两个变量值是否相等。例如 1、简单数据类型比较 a = 10; b = 10; if(a == b){    //写要执行的代码 } 2、引用数据类型比...

java 资料 equals 与== 的区别

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

Java学习从菜鸟变大鸟之一 hashCode()和equals()的本质区别和联系

equals()是判读两个Set是否相等[前提是equals()在类中被覆盖]。==决定引用值是否指向同一对象。 1、当向集合set中增加对象时,首先计算要增加对象的hashCode码,根据该值来得到...
  • lishehe
  • lishehe
  • 2014年01月28日 11:43
  • 4959

Java中两个对象的比较 equals()方法和==号的区别

在Java中,时不时我们会把两个对象进行,然而得到的结果却不是我们想的结果,这是怎么回事呢? 一、两种形式的比较:比较时,我们要弄清楚是哪一种比较。       1.值类型比较       即内容...

Java中的“==”、equals和hashcode的区别与联系

Java中的equals方法和hashCode方法是Object中的方法,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这两个方法,今天就来介绍一些这两个方法的作用。 一...

Java 中 == 与 equals() 方法的区别

== 与 equals() 都有比较两者是否相等的意思, == 用于比较两个操作数的值是否相等,equals() 默认是对 == 的封装,通常需要自定义重写来定义不同的相等条件关系操作符 ===...
  • TTCCAAA
  • TTCCAAA
  • 2016年03月31日 20:49
  • 450

java中 == 与equals 的区别

今天上课学hibernate  老师突然问到了==与equals的区别 ,于是回来百度一下,发现这篇文章写得还不错,所以转来看看 转载地址:http://xiashengchao.iteye.com/...

JAVA中“==”与equals()方法区别

equals 方法是 java.lang.Object 类的方法 有两种用法说明: (1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。 “==”比较两...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中"equals"和"=="的区别
举报原因:
原因补充:

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