美文网首页
Java中== &equal&hashcode比较-02-25

Java中== &equal&hashcode比较-02-25

作者: 封_绝 | 来源:发表于2019-02-25 14:17 被阅读0次

    ==:

    ==在基本数据类型中表示值的比较,

    在两个包装器类中的==表示地址的比较,此时相当于引用数据类型,

    但是一个包装器类与一个基本数据类型之间的==依旧表示值的比较。

    ==在引用数据类型中表示地址的比较,如String

    int a =123;

    int integer1 =new Integer(123);//自动拆箱,同int integer1 = 123;

    int integer2 =new Integer(123);

    Integer integer3 =new Integer(123);

    Integer integer4 =new Integer(123);

    System.out.println("a == integer1:" + (a == integer1));

    System.out.println("a == integer2:" + (a == integer2));

    System.out.println("integer1 == integer2:" + (integer1 == integer2));

    System.out.println("integer3 == integer4:" + (integer3 == integer4));

    System.out.println("a == integer4:" + (a == integer4));

    System.out.println("a == integer3:" + (a == integer3));

    a == integer1:true(==表示值的比较)

    自动拆箱,基本数据类型在栈中,基本数据类型直接将值赋给a(引用数据类型通过查找是否有该值的地址,有的话直接将地址赋值给a?比如string)

    a == integer2:true(==表示值的比较)

    integer1 == integer2:true(==表示值的比较)

    integer3 == integer4:false (两个对象用==表示地址的比较)

    a == integer4:true(==表示?值的比较还是内存的比较)如果是内存的比较,则integer3 == integer4了,所以应该是值的比较,但无法验证

    a == integer3:true

    输出hashcode的值全部不一样

    System.out.println(System.identityHashCode(a));              460141958 

    System.out.println(System.identityHashCode(integer1));1163157884

    System.out.println(System.identityHashCode(integer2));1956725890

    System.out.println(System.identityHashCode(integer3));356573597

    System.out.println(System.identityHashCode(integer4));1735600054

    equal:

    官方文档的解释是:equals官方文档解释

    个人大概理解:两个对象的地址比较,如果是两个对象声明指向同一个实例(也就是引用地址相同),则返回true。此时与引用数据类型的==作用相同,实际上也是用==实现的。

    但是在String或者Integer中的equals被重写过,而他们的作用是比较两个对象的value是否相同,而不是比较引用地址。此时与基本数据类型的==作用相同。(暂时只知道String,Integer以及Date)

    hashCode:

    官方文档:hashCode官方文档的解释

    个人理解:hashCode就是一个计算出来的hash值,该hash值与相关的地址有联系,可以通过hash值直接索引到对象。

    hashCode与equal的联系:如果hashCode相同,equals可能相同,可能不同;如果equal相同,hashCode一定相同。

    原因:equals是直接比较引用对象的地址,而hashCode是通过地址计算出来的值,例如:如果通过取余计算出简单的hashcode,1%7和8%7是相同的,可能是以数组链表的形式解决冲突,例如HashMap

    Hash Map的数组链表存储方式

    hashCode和equals重写时需要一起重写。并且按照上面规则重写(如果equal相同,hashCode一定相同;hashCode相同,equals则不一定)。

    相关文章

      网友评论

          本文标题:Java中== &equal&hashcode比较-02-25

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