Java 中的 equals 和 == 的区别
为了探究两者的关系,我们从 Java 中的数据类型开始谈起:
- JDK 中规定了两种数据存放的位置,堆和栈。
我们常说的基本数据类型是放在栈内的。而对象是放在堆内。在Java中,只有特定的类型可以放在栈上,比如咱们刚才说到的基本数据类型。放在堆上的内容,在栈上都有一个地址指针,对应着放着对象的堆内存地址。 -
所有的 equals 方法都是继承自 Object 类
在Java API 文档中,我们找到 Object 类的 equals 方法
Object 的equals 方法
Java 文档中说,Eques方法在非空对象引用上实现等价关系。并举了4个例子
- It is reflexive :也就是非自身的,就是x.equals(x) 返回的是true。
- It is symmetric:这个就是说引用也是相同的。 x 引用 y ,则x.equals(y) 和 y.equals(x) 返回值为true。
- It is transitive:与上一条相同,连续的引用也是返回true。比如 x 引用 y,y 引用 z。
- It is consistent:无论多次引用,只要不改变里面的值,无论引用多少次都是返回true。
非空的x ,x.equals(null) 返回false。
这里,我们知道了equal函数的大致作用了,就是为了判断,传入的参数到底是不是我自己。
那么就清晰明了了
也就是说,要先和自己相比。然后是看是不是自己的实例,在比较值。


聪明的大家肯定看到了,为什么String 的 equals方法有判断 this == anObject 而 Boolean 没有。
因为 String 有空构造函数,而 Boolean没有空构造函数。所以,Boolean 每创建一个实例,就是一个新的实例,肯定不等于自己,而 String则不然。


- 看到这里,我们发现,所有对象的equals方法都用到了==
那么聪明的你也踩到了==是用来判断他们的内存地址和所存的 values 是否在值上相同。
网友评论