我的理解是:==比较的是存储在栈中的东西
而equals比较的是存储在堆中的东西。
复合数据类型的变量在栈中存储的是引用类型变量的地址,本身存储在堆中。所以用==比较它们不等,用equals比较则相等。
Java中的数据类型,可分为两类:
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
他们之间的比较,应用双等号(==),比较的是他们的值。
2.复合数据类型(类)
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
Object中的equals的方法比较对象的内存地 址
String中重写了equals的方法覆盖了Object中的equals的方法
测试结果如下:
Integer基本类型的比较
应该用==或equals得到结果都是true。
但有下面一点需要注意
为什么128==128是false?
看下源代码吧,底层的实现是这样的:
如果传入的int在IntegerCache.low和IntegerCache.high之间,那就尝试看前面的缓存中有没有打过包的相同的值,如果有就直接返回,否则就创建一个Integer实例。IntegerCache.low 默认是-128;IntegerCache.high默认是127.