热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java之比较两个对象

转载请注明出处http:blog.csdn.netpony_maggiearticledetails43907633作者:小马先看一段代码

转载请注明出处

http://blog.csdn.net/pony_maggie/article/details/43907633


作者:小马

 

先看一段代码:

class Value
{
	int i;
}

public class Equivalence 
{

	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{
		// TODO Auto-generated method stub
		Integer n1 = new Integer(47);
		Integer n2 = new Integer(47);
		
		System.out.println(n1 == n2);
		System.out.println(n1.equals(n2));
		
		Value v1 = new Value();
		Value v2 = new Value();
		v1.i = v2.i = 100;
		System.out.println(v1.equals(v2));

	}

}


 

输出的结果是

false
true
false


 

第一个false是因为 == 比较的是对象引用,n1和n2是两个不同的对象(尽管某个成员的值相等),所以结果是false。不过像这样的比较,大部分时候我们期望返回true,因为我们想比较的是47 == 47。那就只能用equals方法,所以第二个输出的是true。

 

第三个又是怎么一回事呢?事实上euqals是基类Object中的方法,它的缺省实现是比较两个对象的引用,Value类没有重写这个方法所以比较的结果还是false。Integer因为是内置的类,已经重写了equals方法。

 

又引出来一个问题,如何重写euqals方法呢?

class Value
{
	int i;
	
	public int hashCode()
	{
		return i;
	}
	public boolean equals(Object oo)
	{
		return (i == ((Value)oo).i);
	}
}


 

注意到hashCode也重写了,在这里hashCode其实不是必须的。不过大部分情况下,如果你重新实现了euqals,都要重写hashCode,我们要保证equals相等的两个对象,它们的hashCode也要相等,所以要根据equals的实现规则重写hashCode。

 

另外,补充一点,Java语言对equals()的要求如下,这些要求是必须遵循的:

对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。 
反射性:x.equals(x)必须返回是“true”。 
类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。 
还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。


 

 


推荐阅读
author-avatar
三光937
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有