java基礎學習之六:String型別

趙明威發表於2015-11-24

一、String型別本質

1.String 首先是個類

2.首先String類是final的(final 關鍵字用於類說明該類是不能被繼承的)

public final class String...

所以上結合第四節和第五節說的String型別的引用一旦建立並賦值就不能改變了;

3.String物件初始化

String s = new String("abc");

實際上建立了兩個String物件,一個是"abc"物件,儲存在常量空間中,一個是使用new關鍵字為物件s申請的空間,儲存引用地址。

String str = "abc";

在執行到雙引號包含字串的語句時,JVM會先到常量池裡查詢,如果有的話返回常量池裡的這個例項的引用,否則的話建立一個新例項並置入常量池裡,如上面所示,str 和 s 指向同一個引用.

4.常量池

java中的常量池技術,是為了方便快捷地建立某些物件而出現的,當需要一個物件時,就可以從池中取一個出來(如果池中沒有則建立一個),則在需要重複重複建立相等變數時節省了很多時間。常量池其實也就是一個記憶體空間,不同於使用new關鍵字建立的物件所在的堆空間

例如

//s1,s2分別位於堆中不同空間  

String s1=new String("hello");  
String s2=new String("hello");  
System.out.println(s1==s2)  //輸出false  ,== 對於引用型別的比較,只是對於引用地址進行比較, 

//s3,s4 的值是常量池同一位置

String s3="hello";  
String s4="hello";  
System.out.println(s3==s4);//輸出true  

5.String連線操作時生成新物件or not a.String連線(拼接 + )操作不產生新物件的情況是,常量池中有 String拼接的結果

如:

    String a = "a"+"b";
    String b = "ab";
    System.out.println(a==b);//結果為true

a == b 得到的結果是 true ,說明 常量池中如果有拼接結果的話,就不會產生新的物件,引用指向常量池中的地址,

又如:

    String a = "a"+"b";
    String b = new String("ab");
    System.out.println(a==b); //false

由於b是建立的物件,與常量池中物件不同,不是常量池物件,所以 a 與 b不是同一引用

二、String型別的重要方法

1). length 方法

該方法的作用是返回字串的長度,也就是返回字串中字元的個數。中文字元也是一個字元。例如:

     String s = "abc";
     String s1 = "Java語言";
     int len = s.length();
     int len1 = s1.length();

則變數len的值是3,變數len1的值是6。

2). equals 方法 該方法的作用是判斷兩個字串物件的內容是否相同。如果相同則返回true,否則返回false。例如:

    String s = "abc";
    String s1 = new String("abc");
    boolean b = s.equals(s1);
    String s2 = "abc";
    String s3 = "ABC";

由於equals比較的是內容:所以s和s1所指的引用的地址雖然不同,但是內容一樣,b 為true; 而使用"=="比較的是兩個物件在記憶體中儲存的地址是否一樣。例如上面的程式碼中,如果判斷:

     boolean b1 =  (s == s1);
     boolean b2 = (s==s2);

則變數b1的值是false,因為s物件對應的地址是"abc"的地址,而s1使用new關鍵字申請新的記憶體,所以記憶體地址和s的"abc"的地址不一樣,所以獲得的值是false ,而s 和 s2 指向的為常量池中的值"abc" 地址相同,則b2為true 。

另外,在String類中存在一個類似的方法equalsIgnoreCase,該方法的作用是忽略大小寫比較兩個字串的內容是否相同。例如:

     boolean b3= s. equalsIgnoreCase (s3);

則變數b3的值是true。

3).charAt方法

該方法的作用是按照索引值(規定字串中第一個字元的索引值是0,第二個字元的索引值是1,依次類推),獲得字串中的指定字元。例如:

     String s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
     char c = s.chatAt(1);

則變數c的值是'b' ,這樣就使數字 0,1,2,3.....51與這些字母對應起來了,這樣在畫驗證碼的時候十分合適。

4).compareTo方法

該方法的作用是比較兩個字串的大小,比較的原理是依次比較每個字元的字元編碼。首先比較兩個字串的第一個字元,如果第一個字串的字元編碼大於第二個的字串的字元編碼,則返回大於0的值,如果小於則返回小於0的值,如果相等則比較後續的字元,如果兩個字串中的字元編碼完全相同則返回0。

      String s = "abc";
      String s1 = "abd";
      int value = s.compareTo(s1);

則value的值是小於0的值,即-1。 在String類中還存在一個類似的方法compareToIgnoreCase,這個方法是忽略字元的大小寫進行比較,比較的規則和compareTo一樣。例如:

       String s = "aBc";
       String s1 = "ABC";
       int value = s. compareToIgnoreCase (s1);

則value的值是0,即兩個字串相等。

5).concat方法

該方法的作用是進行字串的連線,將兩個字串連線以後形成一個新的字串。例如:

       String s = "abc";
       String s1 = "def";
       String s2 = s.concat(s1);

則連線以後生成的新字串s2的值是"abcdef",而字串s和s1的值不發生改變。如果需要連線多個字串,可以使用如下方法:

       String s = "abc";
       String s1 = "def";
       String s2 = "1234";
       String s3 = s.concat(s1).concat(s2);

則生成的新字串s3的值為"abcdef1234"。 其實在實際使用時,語法上提供了一種更簡單的形式,就是使用"+"進行字串的連線。例如:

     String s = "abc" + "1234";

則字串s的值是"abc1234",這樣書寫更加簡單直觀。

而且使用"+"進行連線,不僅可以連線字串,也可以連線其他型別。但是要求進行連線時至少有一個參與連線的內容是字串型別。而且"+"匹配的順序是從左向右,如果兩邊連線的內容都是基本數字型別則按照加法運算,如果參與連線的內容有一個是字串才按照字串進行連線。

例如:

     int a = 10;
     String s = "123" + a + 5;

則連線以後字串s的值是"123105",計算的過程為首先連線字串"123"和變數a的值,生成字串"12310",然後使用該字串再和數字5進行連線生成最終的結果。 而如下程式碼:

     int a = 10;
     String s = a + 5 + "123";

則連線以後字串s的值是"15123",計算的過程為首先計算a和數字5,由於都是數字型則進行加法運算或者數字值15,然後再使用數字值15和字串"123"進行連線獲得最終的結果。 而下面的連線程式碼是錯誤的:

     int a = 12;
     String s = a + 5 + 's';

因為參與連線的沒有一個字串,則計算出來的結果是數字值,在賦值時無法將一個數字值賦值給字串s。

6).endsWith方法

該方法的作用是判斷字串是否以某個字串結尾,如果以對應的字串結尾,則返回true。 例如:

     String s = "student.doc";
     boolean b = s.endsWith("doc");

則變數b的值是true。

7).startsWith方法 startsWith判斷是否以某字串作為開頭,如果是則返回true,否則false

        String s = "helloworld";
        System.out.println(s.startsWith("hello"));

8).indexOf方法

該方法的作用是查詢特定字元或字串在當前字串中的起始位置,如果不存在則返回-1。例如:

         String s = "abcded";
         int index = s.indexOf('d');
         int index1 = s.indexOf('h');

則返回字元d在字串s中第一次出現的位置,數值為3。由於字元h在字串s中不存在,則index1的值是-1。 當然,也可以從特定位置以後查詢對應的字元,例如:

         int index = s.indexOf('d',4);

則查詢字串s中從索引值4(包括4)以後的字元中第一個出現的字元d,則index的值是5。 由於indexOf是過載的,也可以查詢特定字串在當前字串中出現的起始位置,使用方式和查詢字元的方式一樣。 另外一個類似的方法是lastIndexOf方法,其作用是從字串的末尾開始向前查詢第一次出現的規定的字元或字串,例如:

        String s = "abcded";
        int index = s. lastIndexOf('d');

則index的值是5。

9) replace方法

該方法的作用是替換字串中所有指定的字元,然後生成一個新的字串。經過該方法呼叫以後,原來的字串不發生改變。例如:

     String s = "abcat";
     String s1 = s.replace('a','1');

該程式碼的作用是將字串s中所有的字元a替換成字元1,生成的新字串s1的值是"1bc1t",而字串s的內容不發生改變。

如果需要將字串中某個指定的字串替換為其它字串,則可以使用replaceAll方法,例如:

     String s = "abatbac";
     String s1 = s.replaceAll("ba","12");

該程式碼的作用是將字串s中所有的字串"ab"替換為"12",生成新的字串"a12t12c",而字串s的內容也不發生改變。 如果只需要替換第一個出現的指定字串時,可以使用replaceFirst方法,例如:

     String s = "abatbac";
     String s1 = s. replaceFirst ("ba","12");

該程式碼的作用是隻將字串s中第一次出現的字串"ab"替換為字串"12",則字串s1的值是"a12tbac",字串s的內容也不發生改變。

9) split方法

該方法的作用是以特定的字串作為間隔,拆分當前字串的內容,一般拆分以後會獲得一個字串陣列。例如:

     String s = "ab,12,df";
     String s1[] = s.split(",");

該程式碼的作用是以字串","作為間隔,拆分字串s,從而得到拆分以後的字串數字s1,其內容為:{"ab","12","df"}。

該方法是解析字串的基礎方法。 如果字串中在內部存在和間隔字串相同的內容時將拆除空字串,尾部的空字串會被忽略掉。例如:

     String s = "abbcbtbb";
     String s1[] = s.split("b");

則拆分出的結果字串陣列s1的內容為:{"a","","c","t"}。拆分出的中間的空字串的數量等於中間間隔字串的數量減一個。例如:

     String s = "abbbcbtbbb";
     String s1[] = s.split("b");

則拆分出的結果是:{"a","","","c","t"}。最後的空字串不論有多少個,都會被忽略。 如果需要限定拆分以後的字串數量,則可以使用另外一個split方法,例如:

     String s = "abcbtb1";
     String s1[] = s.split("b",2);

該程式碼的作用是將字串s最多拆分成包含2個字串陣列。則結果為:{"a","cbtb1"}。 如果第二個引數為負數,則拆分出儘可能多的字串,包括尾部的空字串也將被保留。 10) trim方法

該方法的作用是去掉字串開始和結尾的所有空格,然後形成一個新的字串。該方法不去掉字串中間的空格。例如:

      String s = "   abc abc 123 ";
      String s1 = s.trim();

則字串s1的值為:"abc abc 123"。字串s的值不變。

11) getBytes方法

該方法的作用是將字串轉換為對應的byte陣列,從而便於資料的儲存和傳輸。例如:

     String s = "計算機";
     byte[] b = s.getBytes();   //使用本機預設的字串轉換為byte陣列
     byte[] b = s.getBytes("gb2312"); //使用gb2312字符集轉換為byte陣列

在實際轉換時,一定要注意字符集的問題,否則中文在轉換時將會出現問題。

12)valueOf方法

該方法的作用是將其它型別的資料轉換為字串型別。需要注意的是,基本資料和字串物件之間不能使用以前的強制型別轉換的語法進行轉換。 另外,由於該方法是static方法,所以不用建立String型別的物件即可。例如:

     int n = 10;
     String s = String.valueOf(n);

則字串s的值是"10"。雖然對於程式設計師來說,沒有發生什麼變化,但是對於程式來說,資料的型別卻發生了變化。 介紹一個簡單的應用,判斷一個自然數是幾位數字的邏輯程式碼如下:

     int n = 12345;
     String s = String.valueOf(n);
     int len = s.length();

則這裡字串的長度len,就代表該自然數的位數。這種判斷比數學判斷方法在邏輯上要簡單一些。

甚至可以寫成`String s = n +"";

三、String與基本資料型別,或者包裝資料型別相互轉化

1.基本資料型別或者包裝型別轉化為String有三種方法:

int i = 3;

1.) String s = String.valueOf(i);

2.) String s = Integer.toString(i);

3.) String s = "" + i;

2.String型別轉化為基本資料型別和包裝資料型別

    String str = "123";
    int i = Integer.parseInt(str);
    Integer j = Integer.parseInt(str);
    System.out.println(i);

注意與實際型別的對應,如果不對應,就會出現異常;如果str = null時出現空指標異常;

但是如果str = "123.11" ,轉化的時候會出現錯誤,

或者str中間不全是數字也會出現錯誤String str = "123a";

Exception in thread "main" java.lang.NumberFormatException: For input string: "123.11"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)

最近申請了微信公眾號,希望大家來看看,專門為程式設計師而生,做最好的程式設計

高斯程式設計

相關文章