hashcode、equals、“==”的深入理解

在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<Student,String> map = new HashMap<Student,String>();
  	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相同对象未必相等。

转载于:https://my.oschina.net/sld880311/blog/1485949

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值