==
它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。
- 基本数据类型+String常量==比较的是值
- 引用数据类型==比较的是内存地址
equals()
它的作用也是判断两个对象是不是相等。但是它一般有两种使用情况:
● 情况1:类没有覆盖equals()方法。则通过equals()比较该类的两个对象时,等价于"=="比较这两个对象。
● 情况2:类覆盖了equals()方法。一般,我们都覆盖equals()方法来比较两个对象的内容是否相等。
public class testEquals {
public static void main(String argu[]){
String a = new String("ab"); // a 为一个引用
String b = new String("ab"); // b为另一个引用,对象的内容一样
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
Integer aaa = 127; // 放在常量池中
Integer bbb = 127; // 从常量池中查找
Integer aaaa = 128; // 放在常量池中
Integer bbbb = 128; // 在堆内存中创建一个新的对象
if (aa == bb){ //true
System.out.println("aa == bb");
}
if (a == b){ //false,非同一对象
System.out.println("a == b");
}
if (a.equals(b)){ //true
System.out.println("a.equals(b)");
}
if (aa.equals(bb)){ //true
System.out.println("aa.equals(bb)");
}
if (aa.equals(b)){ //true
System.out.println("aa.equals(b)");
}
if (a.equals(bb)){ //true
System.out.println("a.equals(bb)");
}
if (42 == 42.0){ //true
System.out.println("42 == 42.0");
}
if (aaa == bbb){ //true
System.out.println("aaa == bbb");
}
if (aaa.equals(bbb)){ //true
System.out.println("aaa.equals(bbb)");
}
if (aaaa == bbbb){ //false,非同一对象
System.out.println("aaaa==bbbb");
}
if (aaaa.equals(bbbb)){ //true
System.out.println("aaaa.equals(bbbb)");
}
}
}
说明
● String中的equals()方法是被重写过的,因为object的equals()方法是比较对象的内存地址,而String的equals()方法是比较对象的值;
● 当创建String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同对象,如果有,则就把它赋值给当前引用。如果没有就在常量池中重新创建一个String对象;
● 因为 Integer 在常量池中的存储范围为[-128,127],127在这范围内,因此是直接存储于常量池的,而128不在这范围内,所以会在堆内存中创建一个新的对象来保存这个值,所以aaaa,bbbb分别指向了两个不同的对象地址,故而导致了不相等。