详细解释了,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,所有需要到键值对的地方。
网友评论