String類中的equals方法總結
最近我發現了一個事情,那就是在面試筆試中,好多公司都喜歡在String字串上出問題,涉及到方方面面的知識,包括其中的一些常用方法。在此,我總結下關於String類中的equals方法,以備應對以後的筆試面試。
String類的定義:
java.lang
類 String
public final class Stringextends 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一起交流學習哦~