Java中==和equals区别

我的理解是:==比较的是存储在栈中的东西

而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. 

最后建议:若我们要比较两个对象的内容是否相同,应该用equals,尽量不用==。比较基本类型则两者均可以。

猜你喜欢

转载自blog.csdn.net/ziyonghong/article/details/81095860