在java中,== 用来表示变量之间存贮的值是否相等。
我们知道,在java中,变量有基本数据类型和复杂数据类型(对象)的变量。其中基本数据类型变量里存贮的就是变量的值,而复杂数据类型变量中存贮的是其引用的对象在内存中存放的地址。换句话说,就是 == 在比较基本数据类型,是比较这两个值是否相等,比如:int a = 10; int b = 10;int c = 5 则 a == b 为true;a == c为false。而 == 在比较两个复杂型数据结构时,表示的是这两个变量所引用的对象在内存中的存贮地址是否相等,比如 Person zam = new Person(); Person lisi = new Person();Person wang = zam;那么zam == lisi 为false。因为zam和lisi的引用对象都是在内存中通过new 出来的对象,他们在内存中存放的位置也肯定是不一样的。而zam == wang 为true。因为通过
Person wang = zam,就把zam引用的对象的地址也给了wang,即wang和zam都是引用同一个对象。
而equals()方法呢?我们先看下Object类中关于equals方法是如何实现的
public boolean equals(Object o) {
return this == o;
}
从上面的源码可以看出,在object类中equals方法其实就是调用 == 来比较的。也就是说在object类中 equals方法和 == 其实是等价的。但是在很多object子类中有重载equals方法,使得它表示的内容发生了变化。比如我们最熟悉String类。String类通过重载equals方法,来比较两个字符串的内容是否相等。也就是String里的equals方法已经不再是比较两个对象的存放地址了,而是比较两个字符串的内容是否相等。
比如 String a = new String("abc"); String b = new String("abc");这时a == b 为false,但是a.equals(b) 为true。
所以对于没用重载equals方法的类来说,equals 和 == 是一样的。而对于重载了equals方法的类来说,就要看具体的equals方法的实现了。