String類型equals方法講解


 

目錄(?)[+]

 

 

 

 

 

(尊重勞動成果,轉載請注明出處:http://blog.csdn.net/qq_25827845/article/details/53868815冷血之心的博客)

 

最近我發現了一個事情,那就是在面試筆試中,好多公司都喜歡在String字符串上出問題,涉及到方方面面的知識,包括其中的一些常用方法。在此,我總結下關於String類中的equals方法,以備應對以后的筆試面試。

 

String類的定義:

java.lang 
類 String

java.lang.Object
  java.lang.String
所有已實現的接口:
SerializableCharSequenceComparable< String>

 


 

public final class String
extends  Objectimplements  SerializableComparable< String>,  CharSequence
 
          

String 類代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作為此類的實例實現。

字符串是常量;它們的值在創建之后不能更改。字符串緩沖區支持可變的字符串。因為 String 對象是不可變的,所以可以共享。

例如:

     String str = "abc";
 

等效於:

     char data[] = {'a', 'b', 'c'};
     String str = new String(data);

 

 

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. }  

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM