(Java)如何判斷字串是否相等以及比較字串的大小
在Java中,經常需要比較兩個字串,這裡總結一下。
1.判斷字串是否相等
在Java中,可以使用“==”來進行判斷字串是否相等。
示例:
String s1="Hello";
String s2="Hello";
//輸出返回值
System.out.println(s1==s2);
這時,我們如果執行一下,會發現會輸出“true”。
換一種賦值方式再試試。
String s1="Hello";
String s2=s1;
//輸出返回值
System.out.println(s1==s2);
這是,執行一下程式,輸出的值為“true”。
但是我們知道,字串的初始化有兩種方式:直接等號賦值與用new初始化,直接等號賦值放入記憶體池,其它變數也可以引用;new初始化分配記憶體空間,不可引用;
因此,我們用new初始化的方式試一試。
String s1=new String("Hello");
String s2=new String("Hello");
//輸出返回值
System.out.println(s1==s2);
這時,輸出的結果會變成false。
為什麼會有這樣的結果呢?這和記憶體中的常量池有關。
常量池屬於方法區的一部分,當執行到s1建立物件時,如果常量池中沒有,就在常量池中建立一個物件”Hello”,第二次建立的時候,就直接使用,所以兩次建立的物件其實是同一個物件,它們的地址值相等。而對於兩個基本資料型別,“==”比較的是兩個物件的值是否相等;而對於引用型別,“==”比較的是兩個物件的地址是否相等。
因此前兩次的結果都是false。
再回到第三次的比較的賦值語句,
String s1=new String("Hello");
String s2=new String("Hello");
上文中提到,new初始化分配記憶體空間,不可引用;也就是說,上面的“System s1=new String("Hello")”,相當於建立了兩次物件,一次是在常量池中建立了物件”Hello”,一次是在堆記憶體中建立了物件s1。下一個語句也是同理。因此s1、s2的地址不一樣,因此這輸出false。所以使用“==”判斷的時候需要注意的地方比較多。
那麼想要毫無顧慮地判斷引用型別是否相等該怎麼辦呢?這時候equals()方法就派上用場了。
為什麼這麼說呢?
這和equals()方法的重寫有關。在equals()方法存在於Object類中,因為Object類是所有類的直接或間接父類,也就是說所有的類中的equals()方法都繼承自Object類,而通過原始碼我們發現,Object類中equals()方法底層依賴的是==號,那麼,在所有沒有重寫equals()方法的類中,呼叫equals()方法其實和使用==號的效果一樣,也是比較的地址值,然而,Java提供的所有類中,絕大多數類都重寫了equals()方法,重寫後的equals()方法一般都是比較兩個物件的值,即比較兩個物件的內容 。
因此,想要比較兩個物件的值是否相等,可以通過equals()方法來完成。
示例:
string s1="Hello";
string s2="Hello";
//輸出返回值
System.out.println(s1==s2);
string s1="Hello";
string s2=s1;
//輸出返回值
System.out.println(s1==s2);
string s1="Hello";
string s2="He";
//輸出返回值
System.out.println(s1==s2);
這時,因為前兩個比較語句,s1和s2相等,因此會輸出兩個true,最後一個比較語句由於s1和s2不相等,因此會輸出一個false。
2.比較字串的大小
在Java中,我們用compareTo()方法來比較字串的大小。該方法屬於java.lang.String包下,是Java提供的一個字串比較的方法。
CompareTo()返回值: int
它是先比較對應字元的大小(ASCII碼順序),返回值型別分別有三種,小於0,等於0,大於0, 1. 如果字串相等返回值0; 2. 如果第一個字元和引數的第一個字元不等,結束比較,返回他們之間的差值(ascii碼值)(負值前字串的值小於後字串,正值前字串大於後字串); 3. 如果第一個字元和引數的第一個字元相等,則以第二個字元和引數的第二個字元做比較,以此類推,直至比較的字元或被比較的字元有一方全比較完,這時就比較字元的長度。
語法示例:
String s1 = "abc";
String s2 = "abcd";
String s3 = "abcdf";
String s4 = "1bcdf";
String s5 = "c";
System.out.println( s1.compareTo(s2) ); // -1 (前面相等,此時比較字串的長度,s1長度小1,因此輸出-1)
System.out.println( s1.compareTo(s3) ); // -2(前面相等,此時比較字串的長度,s1長度小2,因此輸出-2)
System.out.println( s1.compareTo(s4) ); // 48 (第一個字元不相等,此時比較第一個字元的ASCII碼,"a"的ASCII碼是97,"1"的的ASCII碼是49,所以返回48)
System.out.println( s1.compareTo(s5) ); // -2 (第一個字元不相等,此時比較第一個字元的ASCII碼,"a"的ASCII碼是97,"c"的ASCII碼是99,所以返回-2)
以上就是Java中如何比較字元大小以及判斷字串是否相等的方法,如果大家發現了文章裡的錯誤或者有更好的方法,歡迎留言評論,大家一起學習呀。