字符串比較是常見的操做,包括比較相等、比較大小、比較前綴和後綴串等。在 Java 中,比較字符串的經常使用方法有 3 個:equals() 方法、equalsIgnoreCase() 方法、 compareTo() 方法。java
其中最經常使用的是 equals() 方法,下面詳細介紹這 3 個方法的使用。程序員
equals() 方法將逐個地比較兩個字符串的每一個字符是否相同。若是兩個字符串具備相同的字符和長度,它返回 true,不然返回 false。對於字符的大小寫,也在檢查的範圍以內。equals() 方法的語法格式以下:安全
str1.equals(str2);
str1 和 str2 能夠是字符串變量, 也能夠是字符串字面量。 例如, 下列表達式是合法的:函數
"Hello".equals(greeting)
下面的代碼說明了 equals() 方法的使用:測試
String str1 = "abc"; String str2 = new String("abc"); String str3 = "ABC"; System.out.println(str1.equals(str2)); // 輸出 true System.out.println(str1.equals(str3)); // 輸出 false
在第一次進入系統時要求管理員設置一個密碼,出於安全考慮密碼須要輸入兩次,若是兩次輸入的密碼一致才生效,不然提示失敗。具體實現代碼以下:設計
public static void main(String[] args) { String sys = "學生信息管理"; System.out.println("歡迎進入《" + sys + "》系統"); System.out.println("請設置一個管理員密碼:"); Scanner input = new Scanner(System.in); String pass = input.next(); // 設置密碼 System.out.println("重複管理員密碼:"); input = new Scanner(System.in); String pass1 = input.next(); // 確認密碼 if (pass.equals(pass1)) { // 比較兩個密碼 System.out.println("已生效,請牢記密碼:" + pass); } else { System.out.println("兩次密碼不一致,請從新設置。"); } }
運行該程序,因爲 equals() 方法區分大小寫,因此當兩次輸入的密碼徹底一致時,equals() 方法返回 true,輸出結果以下所示:指針
歡迎進入《學生信息管理》系統 請設置一個管理員密碼: abcdef 重複管理員密碼: abcdef 已生效,請牢記密碼:abcdef
不然輸出如圖下所示的結果:code
歡迎進入《學生信息管理》系統 請設置一個管理員密碼: abcdef 重複管理員密碼: aBcdef 兩次密碼不一致,請從新設置。
equalsIgnoreCase() 方法的做用和語法與 equals() 方法徹底相同,惟一不一樣的是 equalsIgnoreCase() 比較時不區分大小寫。當比較兩個字符串時,它會認爲 A-Z 和 a-z 是同樣的。對象
下面的代碼說明了 equalsIgnoreCase() 的使用:排序
String str1 = "abc"; String str2 = "ABC"; System.out.println(str1.equalsIgnoreCase(str2)); // 輸出 true
在會員系統中須要輸入用戶名和密碼進行檢驗,下面使用 equalsIgnoreCase() 方法實現檢驗登陸時不區分用戶名和密碼的大小寫,具體的代碼實現以下所示。
public static void main(String[] args) { String sys = "學生信息管理"; System.out.println("歡迎進入《" + sys + "》系統"); System.out.println("請輸入管理員名稱:"); Scanner input = new Scanner(System.in); String name = input.next(); // 獲取用戶輸入的名稱 System.out.println("請輸入管理員密碼:"); input = new Scanner(System.in); String pass = input.next(); // 獲取用戶輸入的密碼 // 比較用戶名與密碼,注意此處忽略大小寫 if (name.equalsIgnoreCase("admin") && pass.equalsIgnoreCase("somboy")) { // 驗證 System.out.println("登陸成功。"); } else { System.out.println("登陸失敗。"); } }
在上述代碼中,因爲使用 equalsIgnoreCase() 方法進行比較,因此會忽略大小寫判斷。所以輸入 ADMIN 和 SOMBOY 也會驗證經過,以下所示:
歡迎進入《學生信息管理》系統 請輸入管理員名稱: ADMIN 請輸入管理員密碼: SOMBOY 登陸成功。
不然輸出結果以下所示:
歡迎進入《學生信息管理》系統 請輸入管理員名稱: admin 請輸入管理員密碼: sommboy 登陸失敗。
理解 equals() 方法和==
運算符執行的是兩個不一樣的操做是重要的。如同剛纔解釋的那樣,equals() 方法比較字符串對象中的字符。而==
運算符比較兩個對象引用看它們是否引用相同的實例。
下面的程序說明了兩個不一樣的字符串(String)對象是如何可以包含相同字符的,但同時這些對象引用是不相等的:
String s1 = "Hello"; String s2 = new String(s1); System.out.println(s1.equals(s2)); // 輸出true System.out.println(s1 == s2); // 輸出false
變量 s1 指向由「Hello」建立的字符串實例。s2 所指的的對象是以 s1 做爲初始化而建立的。所以這兩個字符串對象的內容是同樣的。但它們是不一樣的對象,這就意味着 s1 和 s2 沒有指向同一的對象,所以它們是不==
的。
所以,千萬不要使用==
運算符測試字符串的相等性,以避免在程序中出現糟糕的 bug。從表面上看,這種 bug 很像隨機產生的間歇性錯誤。
對於習慣使用 C++ 的 String 類的人來講,在進行相等性檢測的時候必定要特別當心。C++ 的 String 類重載了==
運算符以便檢測字符串內容的相等性。惋惜 Java 沒有采用這種方式,它的字符串「看起來、感受起來」與數值同樣,但進行相等性測試時,其操做方式又相似於指針。語言的設計者本應該像對 C++ 那樣也進行特殊處理, 即重定義==
運算符。
固然,每一種語言都會存在一些不太一致的地方。C 程序員從不使用==
對字符串進行比較,而使用 strcmp 函數。Java 的 compareTo 方法與 strcmp 徹底相似。因此下面咱們來介紹 Java 的 compareTo 方法。
一般,僅僅知道兩個字符串是否相同是不夠的。對於排序應用來講,必須知道一個字符串是大於、等於仍是小於另外一個。一個字符串小於另外一個指的是它在字典中先出現。而一個字符串大於另外一個指的是它在字典中後出現。字符串(String)的 compareTo() 方法實現了這種功能。
compareTo() 方法用於按字典順序比較兩個字符串的大小,該比較是基於字符串各個字符的 Unicode 值。compareTo() 方法的語法格式以下:
str.compareTo(String otherstr);
它會按字典順序將 str 表示的字符序列與 otherstr 參數表示的字符序列進行比較。若是按字典順序 str 位於 otherster 參數以前,比較結果爲一個負整數;若是 str 位於 otherstr 以後,比較結果爲一個正整數;若是兩個字符串相等,則結果爲 0。
提示:若是兩個字符串調用 equals() 方法返回 true,那麼調用 compareTo() 方法會返回 0。
編寫一個簡單的 Java 程序,演示 compareTo() 方法比較字符串的用法,以及返回值的區別。代碼以下:
public static void main(String[] args) { String str = "A"; String str1 = "a"; System.out.println("str=" + str); System.out.println("str1=" + str1); System.out.println("str.compareTo(str1)的結果是:" + str.compareTo(str1)); System.out.println("str1.compareTo(str)的結果是:" + str1.compareTo(str)); System.out.println("str1.compareTo('a')的結果是:" + str1.compareTo("a")); }
上述代碼定義了兩個字符串「A」和「a」,而後調用 compareTo() 方法進行相互比較。最後一行代碼拿「a」與「a」進行比較,因爲兩個字符串相同比較結果爲 0。運行後的輸出結果以下:
str = A str1 = a str.compareTo(str1)的結果是:-32 str1.compareTo(str)的結果是:32 str1.compareTo('a')的結果是:0