1. 程式人生 > >String類中的equals方法總結

String類中的equals方法總結

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

String類的定義:

java.lang
類 String

public final class String
extends Objectimplements Serializable, Comparable<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方法怎麼寫的:

 * @param   obj   the reference object with which to compare.
     * @return  {@code true} if this object is the same as the obj
     *          argument; {@code false} otherwise.
     * @see     #hashCode()
     * @see     java.util.HashMap
     */
    public boolean equals(Object obj) {
        return (this == obj);
    }

即直接return (this==obj)此處 某個物件呼叫該方法,this 就指代那個物件。

再來看看String類中的equals方法是如何覆蓋以上方法的:

/**
     * Compares this string to the specified object.  The result is {@code
     * true} if and only if the argument is not {@code null} and is a {@code
     * String} object that represents the same sequence of characters as this
     * object.
     *
     * @param  anObject
     *         The object to compare this {@code String} against
     *
     * @return  {@code true} if the given object represents a {@code String}
     *          equivalent to this string, {@code false} otherwise
     *
     * @see  #compareTo(String)
     * @see  #equalsIgnoreCase(String)
     */
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }


可以看到,在此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。

程式碼如下:

package cn.ywq.test;

class MyString {
	
	char[] value;
	public MyString(char[] value) {
		this.value=value;  //通過構造方法將字元傳入
	}
	
	
	public int equalsString(Object obj) {
		if(this==obj){
			return 0;
		}
		
		//若該物件是MyString型別的
		if(obj instanceof MyString){
			MyString string =(MyString) obj;
			int n=this.value.length;
			if (n>string.value.length) {  //先判斷長度的關係
				return 1;
			}else if(n<string.value.length){
				return -1;
			}else{   //若長度相等
				 char v1[] = this.value;
	             char v2[] = string.value;
	                int i = 0;
	                while (n-- != 0) {  //按照陣列的每一位進行比較
	                    if (v1[i] > v2[i]){
	                    	return 1;
	                    }else if(v1[i] < v2[i]){
	                    	return -1;
	                    }
	                            
	                    i++;
	                }
	                return 0;  //若while迴圈正常結束,則說明相等,返回0

			}
		}
		return -100;  //若傳入的不是MyString型別的物件
		
	}

}

測試程式碼:

package cn.ywq.test;

public class Test {

	public static void main(String[] args) {
		
		char[] value={'a','b','c','d'};
//		char[] value2={'a','b','c','d','e'};
//		char[] value3={'c','b','c','d'};
		char[] value4={'a','b','c',};
		
		MyString myString = new MyString(value);
		MyString s=new MyString(value4);
		int i = myString.equalsString(s); 
		System.out.println(i);
	}

}


 如果對你有幫助,記得點贊哦~歡迎大家關注我的部落格,可以進群366533258一起交流學習哦~