彻底解决 Java中的equals()方法以及与"=="的区别

     在编写代码的过程中,我们经常会遇到当前的equals和==之间的使用,但是,为了弄懂当前的两者之间的关系,我们将分析Object类中的equals方法 和 String类中的equals方法进行解析。

1、Object 中的equals()方法:
(1)通过查找API,说明如下:
equals
public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:

自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z)
应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals
比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,
当且仅当 x 和y引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,
该协定声明相等对象必须具有相等的哈希码。

参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false。
public boolean equals(Object obj) {  
        return (this == obj);  
}
2、String中的equals()方法:
(1)通过查找API,说明如下:
equals
public boolean equals(Object anObject)将此字符串与指定的对象比较。
当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。

覆盖:
类 Object 中的 equals
参数:
anObject - 与此 String 进行比较的对象。
返回:
如果给定对象表示的 String 与此 String 相等,则返回 true;否则返回 false。
     public boolean equals(Object anObject) {

   if (this == anObject) {

                  // 如果当前对象和传进来要进行比较的对象anObject是同一个对象(即地址相同eg同一辆汽车(只有一辆))则返回true 

   return true;   

    }

           // 判断当前的两个字符串的内容是否一致

    if (anObject instanceof String) {
          String anotherString = (String)anObject;
          int n = count;
          if (n == anotherString.count) {
      char v1[] = value;
      char v2[] = anotherString.value;
       int i = offset;
       int j = anotherString.offset;
       while (n-- != 0) {
              if (v1[i++] != v2[j++])
              return false;
   }
return true;
    }
}
return false;

    }

测试代码如下:

private static  void testEquals(){

int a = 5;
int b = 5;
System.out.println(a == b);

String aaString = new String("Hello");
String bbString = new String("Hello");

System.out.println(aaString == bbString);
System.out.println(aaString.equals(bbString));

System.out.println("------print the non string type -------");
Home homeA = new Home();
homeA.setDerection(1);
homeA.setPostion(1);

Home homeB = new Home();
homeB.setDerection(1);
homeB.setPostion(1);

System.out.println(homeA == homeB);
System.out.println(homeA.equals(homeB));
}

其中当前的Home类如下:

public class Home {

private int postion;
private int derection;
private volatile int hashCode;

public int getPostion() {
return postion;
}
public void setPostion(int postion) {
this.postion = postion;
}
public int getDerection() {
return derection;
}
public void setDerection(int derection) {
this.derection = derection;
}

}

打印结果如下:

true
false
true
------print the non string type -------
false

true

于是,得到如下结论:

1、对于基本数据类型,“==”比较的是两者的值是否相等。
2、对于引用数据类型,(1)“==”比较的是引用的地址是否相同(即是否是同一辆汽车(注意,只有一辆汽车));
Object中的.equals()方法和"==’功能一样
(2)但是String类中的.equals()方法重写了,比较的是两个引用对象的内容是否想同
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章