“==” 用来比较两个变量的值是否相等。具体而言:
>>如果两个变量是基本数据类型,使用“==”来比较其对应的值是否相等。
>>如果变量指向的数据是对象,那么用“==”可以比较这两个对象是否指向同一个对象。(但是不能比较两个对象的内容是否相等)
equals是Obeject类中的方法,没有覆盖过的equals方法会直接使用“==”比较两个对象的引用是否相等。
但当equals被覆盖,就可以让它比较对象的内容是否相等,比如string对象。
看一下Java中String对象到底是如何覆写equals()方法的:
public boolean equals(Object anObject) {
if (this == anObject) { //引用相等,指向的同一个对象,肯定是相等的。
return true;
}
if (anObject instanceof String) { //判断是否是String类型
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) { //判断字符串的长度是否相等
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) { //转化为char字符串,然后挨个判断值是否相等
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
下面就是这类问题常考的经典题目了:
1、下面这段代码的输出是什么?
public class EQUals {
public static void main(String[] args) {
Integer i1=127,i2=127,i3=128,i4=128;
System.out.println(i1==i2);
System.out.println(i1.equals(i2));
System.out.println(i3==i4);
System.out.println(i3.equals(i4));
}
}
2、下面这段代码的输出是什么?
public class EQUals {
public static void main(String[] args) {
String s1="Hello";
String s2=new String("Hello");
String s3=s2;
String s4=s3.intern();
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s2==s3);
System.out.println(s3==s4);
System.out.println(s3.equals(s4));
}
}
解析:
第一题的答案是:
true:基本类型是判断值相等。
true:Integer的euqlas方法是直接调用 ==的:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
false: JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以当为Integer i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer i=128时,128不在常量池范围内,所以在自动装箱过程中需new 128,所以地址不一样 。
true:同上,equals比较的是 intValue。
第二题的答案是:
false :s1和s2引用对象不同。
true:s1和s2的值相同。
true:s1和s3的值相同。
true :s2和s3引用对象相同。
false:当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。
true:同上。