面试_java_“==”与equals

89 阅读2分钟

==与equals

  • ==,比较运算符,可以比较基本类型,也可以比较引用类型。
    1. 比较基本类型时,比较的是值是否相同
    2. 比较引用类型时,比较的是地址值是否相同
  • equals是Object类的方法,只能比较引用类型
    1. 没有被重写时,比较的是地址值

      public boolean equals(Object obj) {
        return (this == obj);    // Object类中的equals() 方法
      }
      
    2. 被重写后,按重写的要求来,一般比较的是引用所指向的对象的值,比如String类。



比较字符串时,需要注意两个问题。

1、字符串是怎样被创建的?

  • 如果两个字符串都是用 String a = "hello"; 这种直接定义的方式来创建的,那么第二个字符串会在字符串常量池中与第一个字符串共用同一个引用,因此用 == 比较时他们一定是相等的。
  • 但是,如果两个字符串中只要有一个是用new来创建的,用== 比较时他们就不会相等。因为new可能会创建两个对象,并且返回的引用是第二个对象的引用,这个引用不在字符串常量池中,无法共用。

2、是String字符串还是StringBuffer还是StringBuilder字符串?

  • 这三个中只有String类重写了Object中的equals方法,因此只有它使用equals方法时比较的是字符串的值。



重写equals

想要重写equals()方法,必须要遵守下面几个规则

  • 自反性:对于任何对象x,x.equals(x)应该返回true
  • 对称性:对于任何两个对象x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true
  • 传递性:对于多个对象x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,那么y.equals(z)也应该返回true
  • 一致性:对于两个非空对象x,y,在没有修改此对象的前提下,多次调用返回的结果应该相同
  • 对于任何非空的对象x,x.equals(null)都应该返回false



github.com/Moosphan/An… github.com/Moosphan/An…