Java字符串比較(3種方法)以及對比 C++ 時的注意項

字符串比較是常見的操做,包括比較相等、比較大小、比較前綴和後綴串等。在 Java 中,比較字符串的經常使用方法有 3 個:equals() 方法equalsIgnoreCase() 方法compareTo() 方法java

其中最經常使用的是 equals() 方法,下面詳細介紹這 3 個方法的使用。程序員

equals() 方法

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

例 1

在第一次進入系統時要求管理員設置一個密碼,出於安全考慮密碼須要輸入兩次,若是兩次輸入的密碼一致才生效,不然提示失敗。具體實現代碼以下:設計

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() 方法

equalsIgnoreCase() 方法的做用和語法與 equals() 方法徹底相同,惟一不一樣的是 equalsIgnoreCase() 比較時不區分大小寫。當比較兩個字符串時,它會認爲 A-Z 和 a-z 是同樣的。對象

下面的代碼說明了 equalsIgnoreCase() 的使用:排序

String str1 = "abc";
String str2 = "ABC";
System.out.println(str1.equalsIgnoreCase(str2));    // 輸出 true

例 2

在會員系統中須要輸入用戶名和密碼進行檢驗,下面使用 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() 方法和==運算符執行的是兩個不一樣的操做是重要的。如同剛纔解釋的那樣,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 方法。

compareTo() 方法

一般,僅僅知道兩個字符串是否相同是不夠的。對於排序應用來講,必須知道一個字符串是大於、等於仍是小於另外一個。一個字符串小於另外一個指的是它在字典中先出現。而一個字符串大於另外一個指的是它在字典中後出現。字符串(String)的 compareTo() 方法實現了這種功能。

compareTo() 方法用於按字典順序比較兩個字符串的大小,該比較是基於字符串各個字符的 Unicode 值。compareTo() 方法的語法格式以下:

str.compareTo(String otherstr);

它會按字典順序將 str 表示的字符序列與 otherstr 參數表示的字符序列進行比較。若是按字典順序 str 位於 otherster 參數以前,比較結果爲一個負整數;若是 str 位於 otherstr 以後,比較結果爲一個正整數;若是兩個字符串相等,則結果爲 0。

提示:若是兩個字符串調用 equals() 方法返回 true,那麼調用 compareTo() 方法會返回 0。

例 3

編寫一個簡單的 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
相關文章
相關標籤/搜索