在编写代码的过程中,我们经常会遇到当前的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) {


如果当前对象和传进来要进行比较的对象anObject是同一个对象(即地址相同eg同一辆汽车(只有一辆))则返回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 -------
falsetrue

于是,得到如下结论:


1、对于基本数据类型,“==”比较的是两者的值是否相等。


2、对于引用数据类型,(1)“==”比较的是引用的地址是否相同(即是否是 同一辆 汽车(注意, 只有一辆 汽车));


Object中的.equals()方法和"==’功能一样


(2)但是String类中的.equals()方法重写了,比较的是两个引用对象的 内容 是否想同