equals

Posted 尘埃未定

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了equals相关的知识,希望对你有一定的参考价值。

equals方法:

先来看下equals方法的定义:

技术分享图片

 

由上边我们可以看出,String类中的equals方法是对父类Object类中的equals方法的覆盖,先来看下Object类的equals方法怎么写的:

[java] view plain copy
 
  1. @param   obj   the reference object with which to compare.  
  2.     * @return  {@code true} if this object is the same as the obj  
  3.     *          argument; {@code false} otherwise.  
  4.     * @see     #hashCode()  
  5.     * @see     java.util.HashMap  
  6.     */  
  7.    public boolean equals(Object obj) {  
  8.        return (this == obj);  
  9.    }  

即直接return (this==obj)此处 某个对象调用该方法,this 就指代那个对象。

 

再来看看String类中的equals方法是如何覆盖以上方法的:

[java] view plain copy
 
  1. /** 
  2.      * Compares this string to the specified object.  The result is {@code 
  3.      * true} if and only if the argument is not {@code null} and is a {@code 
  4.      * String} object that represents the same sequence of characters as this 
  5.      * object. 
  6.      * 
  7.      * @param  anObject 
  8.      *         The object to compare this {@code String} against 
  9.      * 
  10.      * @return  {@code true} if the given object represents a {@code String} 
  11.      *          equivalent to this string, {@code false} otherwise 
  12.      * 
  13.      * @see  #compareTo(String) 
  14.      * @see  #equalsIgnoreCase(String) 
  15.      */  
  16.     public boolean equals(Object anObject) {  
  17.         if (this == anObject) {  
  18.             return true;  
  19.         }  
  20.         if (anObject instanceof String) {  
  21.             String anotherString = (String) anObject;  
  22.             int n = value.length;  
  23.             if (n == anotherString.value.length) {  
  24.                 char v1[] = value;  
  25.                 char v2[] = anotherString.value;  
  26.                 int i = 0;  
  27.                 while (n-- != 0) {  
  28.                     if (v1[i] != v2[i])  
  29.                             return false;  
  30.                     i++;  
  31.                 }  
  32.                 return true;  
  33.             }  
  34.         }  
  35.         return false;  
  36.     }  


可以看到,在此equals方法中有一个value的数组。找到其定义:

技术分享图片

可以看出,value是一个char类型的数组,用于存放字符串中的每个字符。和上边String类的定义相吻合(废话么这不是)。

 判断条件:

    若当前对象和比较的对象是同一个对象,即return true。也就是Object中的equals方法。

    若当前传入的对象是String类型,则比较两个字符串的长度,即value.length的长度。

          若长度不相同,则return false

          若长度相同,则按照数组value中的每一位进行比较,不同,则返回false。若每一位都相同,则返回true。

    若当前传入的对象不是String类型,则直接返回false

   

 

*******************************************String类的equals方法的变体形式******************************************

要求:

自己写一个类MyString,里边有一个char[ ]  value,实现里边的equalsString方法,要求可以比较两个MyString类的对象。相等返回0,大于返回1,小于返回-1,若比较的不是MyString类型的对象,则返回-100。

 

代码如下:

[java] view plain copy
 
  1. package cn.ywq.test;  
  2.   
  3. class MyString {  
  4.       
  5.     char[] value;  
  6.     public MyString(char[] value) {  
  7.         this.value=value;  //通过构造方法将字符传入  
  8.     }  
  9.       
  10.       
  11.     public int equalsString(Object obj) {  
  12.         if(this==obj){  
  13.             return 0;  
  14.         }  
  15.           
  16.         //若该对象是MyString类型的  
  17.         if(obj instanceof MyString){  
  18.             MyString string =(MyString) obj;  
  19.             int n=this.value.length;  
  20.             if (n>string.value.length) {  //先判断长度的关系  
  21.                 return 1;  
  22.             }else if(n<string.value.length){  
  23.                 return -1;  
  24.             }else{   //若长度相等  
  25.                  char v1[] = this.value;  
  26.                  char v2[] = string.value;  
  27.                     int i = 0;  
  28.                     while (n-- != 0) {  //按照数组的每一位进行比较  
  29.                         if (v1[i] > v2[i]){  
  30.                             return 1;  
  31.                         }else if(v1[i] < v2[i]){  
  32.                             return -1;  
  33.                         }  
  34.                                   
  35.                         i++;  
  36.                     }  
  37.                     return 0;  //若while循环正常结束,则说明相等,返回0  
  38.   
  39.             }  
  40.         }  
  41.         return -100;  //若传入的不是MyString类型的对象  
  42.           
  43.     }  
  44.   
  45. }  

 

测试代码:

[java] view plain copy
 
    1. package cn.ywq.test;  
    2.   
    3. public class Test {  
    4.   
    5.     public static void main(String[] args) {  
    6.           
    7.         char[] value={‘a‘,‘b‘,‘c‘,‘d‘};  
    8. //      char[] value2={‘a‘,‘b‘,‘c‘,‘d‘,‘e‘};  
    9. //      char[] value3={‘c‘,‘b‘,‘c‘,‘d‘};  
    10.         char[] value4={‘a‘,‘b‘,‘c‘,};  
    11.           
    12.         MyString myString = new MyString(value);  
    13.         MyString s=new MyString(value4);  
    14.         int i = myString.equalsString(s);   
    15.         System.out.println(i);  
    16.     }  
    17.   
    18. }  

以上是关于equals的主要内容,如果未能解决你的问题,请参考以下文章

Object类各个方法的详解

Object类各个方法的详解

java中的==和equals详解

集合之equals与hashCode方法对比