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

2019-02-25  本文已影响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则不一定)。

上一篇下一篇

猜你喜欢

热点阅读