博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hashcode、equals、“==”的深入理解
阅读量:4109 次
发布时间:2019-05-25

本文共 2162 字,大约阅读时间需要 7 分钟。

在java中如何判断两个对象是否相等?

1。“==”

Integer a = new Integer(1);	Integer b = new Integer(1);	System.out.println(a==b);

         返回结果是?false!因为“==”判断的是对象的句柄(物理地址),并不是对象中的内容!如果想判断对象中的内容是否相等只能用equals,当然对于基本数据类型的比较只能用“==”。

2.equals

         还是上面的例子,使用a.equals(b)返回的就是true。如果我们自己创建了一个类Student代码如下:

public class Student { 		private String stuName; 		private String stuNo;		//get、set方法  		public Student(){} 		public Student(String stuName,String stuNo){  			this.stuName = stuName;  			this.stuNo = stuNo; 		} 	}	Student s1 = new Student("123","456");  	Student s2 = new Student("123","456");	System.out.println((s1==s2)+"====="+s1.equals(s2));

       返回结果都是false。why?因为我们创建的每个类都会默认继承Object(所有类的父类),在Object中equals的源码如下:  

public boolean equals(Object obj) { 		return (this == obj);    	}

      很显然方法还是判断的两个对象的句柄是否相同,那我们如何才能实现equals判断内容相同时返回true呢,我们必须对equals方法进行重写。在原有代码中添加 

public boolean equals(Object obj) {//Object中的此方法比较的是句柄  		if(obj==null){//1.看对象是否为空   			return false;  		}  		if(this==obj){ //2.看对象的句柄是否相同   			return true;  		}  		if(!(obj instanceof Student)){//3.看对象类型是否相同,然后再看内容是否相同   			return false;  		}else{   			Student s = (Student)obj;   			return (s.stuName==this.stuName)&&(s.stuNo==this.stuNo);  		} 	}

此时在调用equals时返回的就是true。注:在上面的代码中说明了重写equals的步骤。

此时我们再看下面这个例子,代码如下:

Student s1 = new Student("123","456");  	Student s2 = new Student("123","456");   	Map
map = new HashMap
(); map.put(s1, "11"); map.put(s2, "11"); System.out.println(map.size());

按理说map中的数据应该就有一条记录,但是此时返回的是2.why?这就和hashcode有关了,下面我解释一下java中的hashcode方法。

3.hashcode

大家都知道hashcode这个方法是父类Object中的方法,我们先看一下源码:

public native int hashCode();

它是一个本地方法,也就是说是和个人的计算机有关的,返回的是个哈希码。先说明一下map存放数据的规则,首先大家都知道在map中是不允许存放重复数据的,也就是说一个key对应一个value。那么判断key是否唯一的标准是什么呢,首先满足equals返回true,其次是hashcode的返回值相同。所以一般来说,在重新equals方法之后都要对hashcode方法进行重写。在原有代码中添加如下代码:

public int hashCode() {  		int number = 25;  		if(this.stuName!=null){   			number+=this.stuName.length();  		}  		if(this.stuNo!=null){   			number+=this.stuNo.length();  		}  		return number; 	}

此时map中的值就只有一个了。

4.总结

在判断对象是否相等的时候(一般都是判断对象内容是否相等)采用equals方法,对于基本数据类型的判断只能使用“==”;

如果我们创建类的时候重写了equals方法,那么我们必然也要重写hashcode方法;

对象相等hashcode必然相等,但hashcode相同对象未必相等。

转载地址:http://ryasi.baihongyu.com/

你可能感兴趣的文章
linux使用rarlinux去操作rar格式的文件
查看>>
"阿里Hadoop集群架构及服务体系"分享总结
查看>>
"HBase_介绍和HBase云存储"分享总结
查看>>
"MapReduce研究现状和毕玄-HBase简介与实践分享"分享总结
查看>>
Spring之mybatis集成
查看>>
"淘宝营销平台介绍"分享总结
查看>>
SWOT分析法模板
查看>>
"天猫交易流控降级"分享总结
查看>>
判断数组链表环相关算法
查看>>
"高性能Web服务器Nginx及相关新技术的应用实践"分享总结
查看>>
synchronized之类锁和实例锁
查看>>
HashMap原理小谈之put操作
查看>>
HashMap原理小谈之get操作
查看>>
Java静态代理模式
查看>>
Java动态代理模式
查看>>
云计算的三种服务形式
查看>>
分布式计算框架分类一览表
查看>>
架构师应该具备哪些技能
查看>>
Java图片人物照片头像识别
查看>>
"大数据产品中的异构数据源整合"分享总结
查看>>