兩個字符串比較

兩個字符串比較大小:
    一、可以用compareTo()方法,另外還有compareToIgnoreCase(String) 忽略大小寫及 compareTo(object string)這些 方法返回值是int, 以compareTo()方法爲例:
     1 .如果字符串相等返回值爲0,不等返回其他數值。
比較方法是先比較對應字符的大小(Ascall嗎順序),從第一個字母開始比較。
     2.如果第一個字符和參數的第一個字符不等,結束比較,返回他們之間的差值(ascii碼值)
               (負值前字符串的值小於後字符串,正值前字符串大於後字符串)
     3.如果第一個字符和參數的第一個字符相等,則以第二個字符和參數的第二個字符做比較,

以此類推,直至比較的字符或被比較的字符有一方全比較完,這時就比較字符的長度. 

例如:

                        String s1 = "abc"; 
			String s2 = "abcd"; 
			String s3 = "abcdfg"; 
			String s4 = "1bcdfg"; 
			String s5 = "cdfg"; 
			System.out.println( s1.compareTo(s2) ); // -1 (前面相等,s1長度小1) 
			System.out.println( s1.compareTo(s3) ); // -3 (前面相等,s1長度小3) 
			System.out.println( s1.compareTo(s4) ); // 48 ("a"的ASCII碼是97,"1"的的ASCII碼是49,所以返回48) 
			System.out.println( s1.compareTo(s5) ); // -2 ("a"的ASCII碼是97,"c"的ASCII碼是99,所以返回-2)

二、還可以用“==”和.equals()方法判斷大小:

1.“==”是一個判斷相等的運算符,如果兩邊是基本數據類型,它判斷的是值;如果兩邊是複合型數據類型(類類型),它判斷的是地址;地址相同,內容一定相同,地址不同,內容不一定相同。

2..equals() 方法只能判斷複合型數據類型,由於繼承Object類,默認判斷的是兩邊在內存的地址,判斷結果和“==”一樣,但在一些其他的類庫中equals()被重寫,例如String,Integer,Data等類中有其自身的實現,比較內容就不是地址了。

例如:

String str1 = new String("hello");
String str2 = "hello";
 
System.out.println("str1==str2: " + (str1==str2));  \\false
System.out.println("str1.equals(str2): " + str1.equals(str2));  \\true

當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址,所以,除非是同一個new出來的對象,他們的比較後的結果爲true,否則比較後結果爲false。

但equals() 在String中被重寫過了,判斷的是內容,不在是內存中的地址,所以是true。

但是String比較特殊,因爲我們都知道jvm把內存分爲3個區,分別是方法區,堆區和棧區。而在方法區中維護者一個String常量池,池中用來存放運行時產生的各種字符串,並且池中的內容不重複。而一般對象不在這個池中,對象放在堆裏。這就需要分析String的創建方式:

1. 當使用任何方式來創建一個字符串對象str=“X”時,Java運行時(運行中JVM)會拿着這個X在String池中找是否存在內容相同的字符串對象,如果不存在,則在池中創建一個字符串str,否則,不在池中添加。

2.Java中,只要使用new關鍵字來創建對象,則一定會(在堆區或棧區)創建一個新的對象。

3 .使用直接指定或者使用純字符串串聯來創建String對象,則僅僅會檢查維護String池中的字符串,池中沒有就在池中創建一個,有則罷了!但絕不會在堆棧區再去創建該String對象。

4 使用包含變量的表達式來創建String對象,則不僅會檢查維護String池,而且還會在堆棧區創建一個String對象。

例如:

String str2 = "hello";
String str3 = "hello";
System.out.println("str3==str2: " + (str3==str2));  \\true
System.out.println("str3.equals(str2): " + str3.equals(str2));  \\true

true的原因是hello都是從常量池中取出來的,但你new出來的不管常量池中有沒有都會新建一個,地址就不一樣了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章