一句话概括:==比较的是两个对象的引用(即内存地址)是否相等,而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;
因为(根)基本类型,(根)对象引用都在栈中(所谓“根”,指未被任何其他对象所包含); 而对象本身在堆中。
文章出处:DIY部落(http://www.diybl.com/course/3_program/java/javajs/2007917/71587.html#)
发表评论
-
网络游戏同步的原理
2011-09-22 20:01 826不知道大家是否碰到过这种情况,当某个玩家发出一个火球,这个火球 ... -
java中的io系统详解
2010-09-16 23:21 889Java 流在处理上分为字符流和字节流。字符流处理的单元为 ... -
java中的日期处理类总结
2010-08-08 20:35 862java中的日期处理类总结:Date/Calendar/Gre ... -
体验J2SE 1.5新特性之增强For循环
2010-04-08 14:49 829J2SE 1.5提供了另一种形 ... -
XPath
2010-03-22 17:52 1627XPath 简介 XPath 是一门 ... -
通过Singleton单例模式,理解Java的类加载
2010-03-22 16:26 1108通过Singleton单例模式,理解Java的类加载----- ... -
全面总结Java泛型
2009-10-25 12:19 769虽然Scala创始人Martin Odersky说当年正是因为 ... -
理解java String
2009-10-20 15:07 616要理解 java中String的运 ... -
字符串相关
2009-10-20 15:06 595Java代码 public class St ... -
Java代码编写的30条建议
2009-05-14 22:21 753(1) 类名首字母应该大写。字段、方法以及对象(句柄)的首字母 ... -
深入了解Java泛型(三) -- 泛型方法
2009-05-07 09:51 1851前面提到的都是与类的泛型化相关的话题,不过方法也可以从泛型中受 ... -
深入了解Java泛型(二) -- 泛型列表与数组
2009-05-07 09:48 1025记得以前面试的时候曾 ... -
深入了解Java泛型(一) -- 泛型与原生态类型
2009-05-07 09:45 1225Java1.5引入了泛型之后, ... -
正则表达式入门
2009-05-07 09:16 616元字符: /b 代表着单词 ...
相关推荐
Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的概念,很多开发者容易混淆它们。理解这两个概念的区别是非常重要的,因为它们对编程的正确性和性能都有很大的影响。 首先,我们需要了解 Java ...
Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的运算符,它们之间的区别是非常重要的。 首先,我们需要了解 Java 中的内存模型。在 Java 中,变量可以分为两种:基本类型(primitive type)和...
Java 中equals和==的区别
Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个常用的操作符,经常用于比较对象或变量的值。然而,许多开发者不知道它们之间的区别,或者误用它们,导致程序出错。下面我们将详细解释 equals 和 == 的...
java中equals和==的区别-5页.pdf
本篇复习将重点讨论String类中的`equals()`方法和`==`运算符的区别,这对于理解对象比较和字符串操作至关重要。 首先,`==`运算符在Java中用于比较基本类型(如int、char)的值,而在比较对象时,它实际上是检查两...
Java中equals和==的区别 Java是一门面向对象的编程语言,它提供了多种运算符和方法来比较对象和变量。在Java中,比较两个对象是否相等时,经常使用到的运算符有"=="和"equals"。虽然两者都可以用于比较,但它们有着...
Java 中的equals和==的区别 Java 是一种面向对象的编程语言,其中有两种数据类型:基本数据类型和引用数据类型。基本数据类型包括整数类型、浮点数类型、字符类型、布尔类型等,共有八种;而引用数据类型则包括 ...
在Java编程语言中,`equals()`方法和`==`运算符是用于比较对象的两种不同方式,它们在处理不同类型的数据时有不同的行为。了解这两者的区别对于编写正确的代码至关重要。 `==`运算符: 1. `==`用于比较基本类型的...
总结,理解`equals()`和`==`的区别是Java编程中的关键知识点。在使用时,根据需要比较的是对象的引用还是内容,选择适当的操作符或方法。对于String类,由于其特殊的常量池机制,`==` 和 `equals()` 的行为可能与...
在Java编程语言中,`equals()` 和 `==` 是两种常用的比较操作,它们在处理不同数据类型时有着明显的区别。本文将深入探讨这两个操作符在Java中的行为,特别是在处理值类型和引用类型时的不同。 首先,值类型如整型...
在Java编程语言中,`equals()` 和 `==` 是两种常用的比较操作,它们在处理不同数据类型时有着明显的区别。`==` 操作符主要用于基本数据类型(如 int, double 等)以及引用类型的变量,它比较的是两个变量所指向的...