美文网首页
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