==与equals在比较两个对象重写equals方法相等时,有什么区别

关于equals比较对象内容的问题。
[问题点数:40分,结帖人xj33hf0331]
本版专家分:0
结帖率 100%
CSDN今日推荐
本版专家分:1470
本版专家分:53927
2011年5月 Java大版内专家分月排行榜第二2011年3月 Java大版内专家分月排行榜第二2010年11月 Java大版内专家分月排行榜第二2010年10月 Java大版内专家分月排行榜第二
2012年2月 Java大版内专家分月排行榜第三2011年8月 Java大版内专家分月排行榜第三2011年6月 Java大版内专家分月排行榜第三2011年4月 Java大版内专家分月排行榜第三2010年12月 Java大版内专家分月排行榜第三
本版专家分:34826
2012年11月 Java大版内专家分月排行榜第二2012年9月 Java大版内专家分月排行榜第二2012年8月 Java大版内专家分月排行榜第二2012年7月 Java大版内专家分月排行榜第二
2012年10月 Java大版内专家分月排行榜第三2012年6月 Java大版内专家分月排行榜第三
本版专家分:5439
本版专家分:0
本版专家分:20
本版专家分:53
本版专家分:4337
本版专家分:9484
2012年5月 挨踢职涯大版内专家分月排行榜第一
本版专家分:64624
2011年6月 Java大版内专家分月排行榜第一
2012年7月 Java大版内专家分月排行榜第三2011年11月 Java大版内专家分月排行榜第三2007年12月 Java大版内专家分月排行榜第三2007年10月 Java大版内专家分月排行榜第三
本版专家分:28
本版专家分:5439
本版专家分:10514
匿名用户不能发表回复!|
其他相关推荐//在比较对象时,“==”和“equals”的区别
//“==”,比较两个引用,是否指向堆内存当中的同一块地址
//“equals”,比较两个对象的值,是否相等
浏览: 4888 次
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'浅谈 equals 和 == 的区别
来源:海子 ,
www.cnblogs.com/dolphin0520/p/3592500.html
在初学Java时,可能会经常碰到下面的代码:
1 String str1 = new String("hello");
2 String str2 = new String("hello");
4 System.out.println(str1==str2);
5 System.out.println(str1.equals(str2));
为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初学Java的时候这个问题不弄清楚,就会导致自己在以后编写代码时出现一些低级的错误。今天就来一起了解一下==和equals方法的区别之处。
一.关系操作符“==”到底比较的是什么?
下面这个句话是摘自《Java编程思想》一书中的原话:
“关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”。
这句话看似简单,理解起来还是需要细细体会的。说的简单点,==就是用来比较值是否相等。下面先看几个例子:
public class Main {
* @param args
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(n==m);
String str = new String("hello");
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1==str2);
System.out.println(str1==str2);
输出结果为 true false true
n==m结果为true,这个很容易理解,变量n和变量m存储的值都为3,肯定是相等的。而为什么str1和str2两次比较的结果不同?要理解这个其实只需要理解基本数据类型变量和非基本数据类型变量的区别。
在Java中游8种基本数据类型:
浮点型:float(4 byte), double(8 byte)
整型:byte(1 byte), short(2 byte), int(4 byte) , long(8 byte)
字符型: char(2 byte)
布尔型: boolean(JVM规范没有明确规定其所占的空间大小,仅规定其只能够取字面值”true”和”false”)
对于这8种基本数据类型的变量,变量直接存储的是“值”,因此在用关系操作符==来进行比较时,比较的就是 “值” 本身。要注意浮点型和整型都是有符号类型的,而char是无符号类型的(char类型取值范围为0~2^16-1).
也就是说比如:
变量n和变量m都是直接存储的”3″这个数值,所以用==比较的时候结果是true。
而对于非基本数据类型的变量,在一些书籍中称作为 引用类型的变量。比如上面的str1就是引用类型的变量,引用类型的变量存储的并不是 “值”本身,而是于其关联的对象在内存中的地址。比如下面这行代码:
String str1;
这句话声明了一个引用类型的变量,此时它并没有和任何对象关联。
而 通过new String(“hello”)来产生一个对象(也称作为类String的一个实例),并将这个对象和str1进行绑定:
str1= new String("hello");
那么str1指向了一个对象(很多地方也把str1称作为对象的引用),此时变量str1中存储的是它指向的对象在内存中的存储地址,并不是“值”本身,也就是说并不是直接存储的字符串”hello”。这里面的引用和C/C++中的指针很类似。
因此在用==对str1和str2进行第一次比较时,得到的结果是false。因此它们分别指向的是不同的对象,也就是说它们实际存储的内存地址不同。
而在第二次比较时,都让str1和str2指向了str指向的对象,那么得到的结果毫无疑问是true。
二.equals比较的又是什么?
equals方法是基类Object中的方法,因此对于所有的继承于Object的类都会有该方法。为了更直观地理解equals方法的作用,直接看Object类中equals方法的实现。
该类的源码路径为:C:Program FilesJavajdk1.6.0_14的src.zip 的java.lang路径下的Object.java(视个人jdk安装路径而定)。
下面是Object类中equals方法的实现:
很显然,在Object类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。
但是有些朋友又会有疑问了,为什么下面一段代码的输出结果是true?
public class Main {
* @param args
public static void main(String[] args) {
// TODO Auto-generated method stub
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1.equals(str2));
要知道究竟,可以看一下String类的equals方法的具体实现,同样在该路径下,String.java为String类的实现。
下面是String类中equals方法的具体实现:
可以看出,String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。
其他的一些类诸如Double,Date,Integer等,都对equals方法进行了重写用来比较指向的对象所存储的内容是否相等。
总结来说:
1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址
2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
看完本文有收获?请转发分享给更多人
关注「ImportNew」,提升Java技能
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点为什么在使用equals()方法比较两个对象是否相等的时候,必须要覆盖equals()方法?
[问题点数:40分]
本版专家分:0
结帖率 66.67%
CSDN今日推荐
本版专家分:4160
2015年11月 Java大版内专家分月排行榜第三2015年10月 Java大版内专家分月排行榜第三
本版专家分:0
本版专家分:82
本版专家分:28
本版专家分:183
本版专家分:126
本版专家分:2447
2015年9月 移动开发大版内专家分月排行榜第一
本版专家分:0
匿名用户不能发表回复!|
其他相关推荐两个对象用equals方法比较为true,它们的Hashcode值相同吗?
&&&&&& 答:不一定相同。正常情况下,因为equals()方法比较的就是对象在内存中的值,如果值相同,那么Hashcode值也应该相同。但是如果不重写hashcode方法,就会出现不相等的情况。
下面的话来自JDK:
& & & & hashCode&& & & &&public int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表(例如&.util.Hashtable 提供的哈希表)的性能。& & & &&hashCode 的常规协定是:&& & & & 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。&& & & &&如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。&& & & &&如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。&& & & &&实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)&equals&public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。&equals 方法在非空对象引用上实现相等关系:&自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。&对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。&传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。&一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。&对于任何非空引用值 x,x.equals(null) 都应返回 false。&Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。&注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。&
& & & &看看红色的部分,说明的是JDK规定当你调用equals方法比较两个对象相等时,他们调用hashcode方法时,都应该返回相同的整数值,也就是hashcode相等。记住,是应该相同。为什么应该?下面这段红色字体说了,必须重写hashcode方法维护...协定!如果你不重写,那么就不能保证hashcode返回相同结果。
换句话说:重写equals方法时请必须重写hashcode,以保证equals方法相等时两个对象hashcode返回相同的值。如果你不按照规范来,就不一定相同了。
阅读(...) 评论()

我要回帖

更多关于 对象重写equals方法 的文章

 

随机推荐