==:
==在基本数据类型中表示值的比较,
在两个包装器类中的==表示地址的比较,此时相当于引用数据类型,
但是一个包装器类与一个基本数据类型之间的==依旧表示值的比较。
==在引用数据类型中表示地址的比较,如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

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