Java中的equals方法看似简单,其实也暗藏玄机,当面试中遇到可以是轻松拿分的点,但基础不扎实也很容易答错。今天仔细研究了一下,在此备忘。
首先可以将Java 中的数据分为四大类:1、String;2、非String的普通类;3、Java的基础数据类型 (内置数据类型);4、Java基础数据类型的封装类。 下面针对这四个大类详细解释:
1. 对于String 类型, equals比较的是String 字符串的内容,而“==”比较的是变量地址。换句话说,只有当两者是同一个实例时“==”才可能为true,而equals则只需要两者的值一致即可得到true。以下为示例代码:
String str1 ="abc";
String str2 ="abc";
String str3 =new String("abc");
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
System.out.println(str1==str3);
System.out.println(str1.equals(str3));
其运行结果为:
true,true,false,true
第2和第4个输出结果很明显,然后为什么“str1==str2”是true,而“str1==str3”是false呢?这里是一个易错点。我们分开来看:
1) 其实只要搞清楚“abc”是一个字符串常量,因此str1与str2看似是两个不同的变量,其实都指向常量“abc”,所以他们的地址是一致的。
2) 反观str3,因为它是通过new String("abc");创建的,它是一个新的字符串,因此它们虽然有相同的字符串值“abc”,但它们地址不同。
---------------------------------------------------------------------------
2. 对于非String的普通Java类,equals方法和“==”都是比较对象的地址:
Person p1 =new Person("wyz", 10);
Person p2 =new Person("wyz", 10);
Person p3 = p1;
System.out.println(p1.equals(p2));
System.out.println(p1==p2);
System.out.println(p1.equals(p3));
System.out.println(p1==p3);
运行结果:
false,false,true,true
---------------------------------------------------------------------------
3. 对于Java中内置的基础数据类型,它们没有equals方法。“==”比较的是他们的值:
int a = 1, b =1;
int c = a;
System.out.println(a==b);
System.out.println(a==c);
运行结果:
true,true
4.最后,对于Java基础数据类型的封装类,类似String,equals方法比较值,而“==”比较地址:
Integer na =new Integer(1);
Integer nb =new Integer(1);
System.out.println(na==nb);
System.out.println(na.equals(nb));
运行结果:
false,true
---------------------------------------------------------------------------
以上主要讨论了Java定义的equals方法,我们其实也可以自行覆写equals方法来达到自己的目的,这里就不详细讨论了。