==
它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型+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){ //trueSystem.out.println("aa == bb");}if (a == b){ //false,非同一对象System.out.println("a == b");}if (a.equals(b)){ //trueSystem.out.println("a.equals(b)");}if (aa.equals(bb)){ //trueSystem.out.println("aa.equals(bb)");}if (aa.equals(b)){ //trueSystem.out.println("aa.equals(b)");}if (a.equals(bb)){ //trueSystem.out.println("a.equals(bb)");}if (42 == 42.0){ //trueSystem.out.println("42 == 42.0");}if (aaa==bbb){ //trueSystem.out.println("aaa==bbb");}if (aaa.equals(bbb)){ //trueSystem.out.println("aaa.equals(bbb)");}if (aaaa==bbbb){ //false,非同一对象System.out.println("aaaa==bbbb");}if (aaaa.equals(bbbb)){ //trueSystem.out.println("aaaa.equals(bbbb)");}}}
说明
- String中的equals()方法是被重写过的,因为object的equals()方法是比较对象的内存地址,而String的**equals()方法是比较对象的值**;
- 当创建String类型的对象时,虚拟机会在常量池中查找**有没有已经存在的值和要创建的值相同对象**,如果有,则就把它赋值给当前引用。如果没有就在常量池中重新创建一个String对象;
- 因为 Integer 在常量池中的存储范围为[-128,127],127在这范围内,因此是直接存储于常量池的,而128不在这范围内,所以会在堆内存中创建一个新的对象来保存这个值,所以aaaa,bbbb分别指向了两个不同的对象地址,故而导致了不相等。
