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

    ==: ==在基本数据类型中表示值的比较, 在两个包装器类中的==表示地址的比较,此时相当于引用数据类型, 但是一...

  • 《教学工作日记1》

    02-25:①教研活动中反思;②写工作日记。

  • Java中的比较?

    参考Java基础之comparator和comparable的区别以及使用 1.== 和 equals的区别 2....

  • Java中对象的比较

    Java中要比较对象的大小或者要对对象的集合进行排序,需要通过比较这些对象的某些属性大小来确定它们之间的大小关系。...

  • java中的比较器

    java中的比较器 代码实现

  • Java中的对象比较

    一、对象的比较 在之前如果是两个数值的比较“==”,如果是字符串的比较一般用“equals()" 方法,这个方法是...

  • java不会的点-02-25

    1.Set有哪些类型,区别是什么 2.hashTable,hashMap,hashTree区别 3.多态的调用:M...

  • Java中的相等比较

    说一说java中的相等比较。 在日本做开发,遇到很多转职Java的小白,常常搞不懂Java中的相等的比较怎么用,所...

  • HashMap的简单解析

    在Java中HashMap算是比较常用的集合框架,是Java中比较典型的数据结构。在本文中主要探究HashMap中...

  • Kotlin ==,===,equals

    == 比较值(类似于java中的 equals)=== 比较地址 equals ...

网友评论

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

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