美文网首页
equals(),hashCode()和==区别与联系

equals(),hashCode()和==区别与联系

作者: 草城篱梦 | 来源:发表于2017-09-14 18:49 被阅读0次

详细解释了,equals和hashCode和==之间的关系,到底是怎么一回事。

基本类型的数据和引用类型的数据

在java语言中,数据的类型的分为两种,基本数据类型(八种)和引用数据类型(三种)。

基本数据类型

整型 byte short int long ex:1,2,3(默认int类型)

浮点型 float double ex:1.0,2.0,30 (默认double类型)

字符类型 char ex:a,b,c,d

布尔类型 boolean ex: boolean x,x=false

引用数据类型

接口

数组

引用类型我的理解就是在实际操作中需要实例化的类型。

==的作用

== 是一个运算符,用于比较两个数据是否相等。

比较的是基本数据类型的时候,比较的是他们的数值是否相等。

比较的是引用数据类型的时候,比较的他们存值的地址是否相等。

注意被比较的数据必须是同一种数据类型的两种数据,比如说同是int类型的两个数据,或者是同是引用类型类型的两个person数据。

//比如存在一个Person类

Person p=newPerson("张三",23);

Person p1=newPerson("张三",23);

//两个基本类型的数据

inta=1;

intb=2;

if(a==b){//由于1!=2 所以输出false

//dosomething

}

//比较引用类型,比较地址,那么很显然,在堆内存中,new出来了两块区域

//这两块的区域的地址显然是不同的,因此输出为false

if(p1==p2){//false

//dosomething

}

equals()方法

所有类的都具有equals方法,因为所有类的都是继承于object类,equals方法是从根类(object.class)中定义的,因此所有类都有equals方法。

//object的equals方法

publicbooleanequals(Object obj){

return(this== obj);

}

Worker w1 =newWorker("张三",23);

Worker w11 =newWorker("张三",23);

HashMap hashMap=newHashMap<>();

hashMap.put(w1,"张三");

//两个值不一样违背了第二条约定

System.out.println(w1.hashCode());

System.out.println(w11.hashCode());

System.out.println(w1.equals(w11));//out true

System.out.println(hashMap.get(w1));//out :张三

System.out.println( hashMap.get(w11);//out null;

把一个worker对象,添加到hashMap里面,以一个引用类型为worker的对象为键,值为张三。因此我们使用hashmap的get方法,希望根据键取得值。

第一个sout语句输出张三是因为,根据键找到了值。

但是第二个sout语句却输出了null!

​根源就在于没有覆盖hashcode方法(hashcode方法也是从object那里继承而来的,和equals方法一样),如果没有覆盖hashcode方法就会导致该类无法结合所有基于散列的集合一起正常运作,比如说hashMap,HashSet,Hashtable,所有需要到键值对的地方。

相关文章

网友评论

      本文标题:equals(),hashCode()和==区别与联系

      本文链接:https://www.haomeiwen.com/subject/hzodsxtx.html