一、==当比较的值是基本类型时是值比较,当值是引用类型时是引用比较。
可以看到当值为int 时做的是值比较,按理来说a1=b1应该输出的false但是可以很明显的看到,输出的是true,但是原则上引用类型比较的是地址,那么就说明,他们俩的地址是一样的,标准并没有这样要求,但是我们的使用的hostpot(JVM)做优化的时候考虑到-128-127这个范围内的数字远远高于其他数字,所以JDK在实现的时候,缓存了-128-127的Integer对象,所以这个范围的Integer只要值相等,他们俩指向的一定是同一对象。其实代码中都有体现。在这个路径下
但是我们在记忆的时候原则上,==在比较基本类型的时候是值比较,在比较引用类型的时候是引用比较,-128-127只是一个版本上的一个优化,不能作为我们判断的依据。
还有一点就是在比较Integer和int的时候,编译器会做一个自动解包的过程,其实是相当于c=a3.intValue();的结果。所以是相等的。
二 、
equals是原始类Object的方法,即所有对象都有equals方法,默认情况下(即没有重写)是引用比较,但是JDK中类很多重写了equals方法(一般是先进行 引用 比较,再判断是否要进行值比较),所以一般情况下是值比较,注:基本类型不能使用equals比较,而是用 == ,因为基本类型没有equals方法。
Integer重写的equals方法:
可以看到使用equals方法就可以进行正确的值比较。
但是比较某个实例对象,一定要确定该类重写了equals方法。没有实现就无法进行比较,重写equals方法就一定要重写hashCode方法。