问答详情
源自:9-9 Java 中的 Object 类 Ⅱ

关于equals()方法有疑问?

老师说equals()方法是比较对象的引用是都指向同一块内存地址。

第一个代码:s1和s2 不同,分别指向不同的对象内存地址

public class Test A{
public static void main(String args[]) {
    String s1 = new String("Hello");
    String s2 = new String("Hello");
   System.out.println(" s1== s2 is " + (s1 == s2));
   System.out.println(" s1.equals(s2) is " + s1.equals(s2));
}
}

结果:

s1== s2 is false
s1.equals(s2) is true

第二个代码:由于字符串常量池的原因,s1和s2相同

public class Test A{
public static void main(String args[]) {
    String s1 =“Hello”;
    String s2 = “Hello";
   System.out.println(" s1== s2 is " + (s1 == s2));
   System.out.println(" s1.equals(s2) is " + s1.equals(s2));
}
}

结果:

 s1== s2 is true
 s1.equals(s2) is true

根据以上两个代码,比较值是否相等是equals(),比较两个引用是否指向同一内存地址是”==“。不过老师下面的代码:

http://img.mukewang.com/55293ffb0001598c04000295.jpg

却显示equals()比较的就是两个引用指向的内存地址是否相同。疑惑,难道是String和普通类创建对象有什么不同?

提问者:passionfoure 2015-04-11 23:05

个回答

  • passionfoure
    2015-04-12 01:03:52

    问题解决了!

    • JDK类中有一些类覆盖了oject类的equals()方法(Object 中equals()方法是比较内存地址的),比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)。

    • 如果在Animal类覆盖equals函数,就会得到不同的效果。