==
它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型+String常量==比较的是值,引用数据类型==比较的是内存地址)
equals()
它的作用也是判断两个对象是不是相等。但是它一般有两种使用情况:
- 情况1:类没有覆盖equals()方法。则通过equals()比较该类的两个对象时,等价于”==”比较这两个对象。
- 情况2:类覆盖了equals()方法。一般,我们都覆盖equals()方法来比较两个对象的内容是否相等;若它们的内容相等,则返回true(即,认为这两个对象相等)。
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分别指向了两个不同的对象地址,故而导致了不相等。