1. 程式人生 > 實用技巧 >Java中的String類

Java中的String類

String類代表字串

  所有字串文字都被實現為此類的例項。

  字串的值在建立後不能被修改,因此,它們可以被共享。

String類主要有6個建構函式:

  1.空構造

    Strings = new String();

  2.使用指定的位元組陣列構造字串

    byte[] bys = {97,98,99,100,101};

    String s = new String(bys);

  3.使用指定位元組陣列的一部分構造字串

    String s = new String(bys,1,3);  //擷取從位元組陣列中索引為1的位元組開始後的3個位元組組成字串

  4.使用指定的字元陣列構造字串

    char[] chs = {'a','b','c','d','e','愛','y','y'};

    String s = new String(chs);

  5.使用指定字元陣列的一部分構造字串

    String s = new String(chs,5,3);

  6.將字串常量的值轉換為字串

    String s = new String("abcde");

    也可以寫作:String s = "abcde";

String類中==和equals的區別:

  請先看以下程式碼,能否全部理解:

 1 public class StringDemo2 {
 2
public static void main(String[] args) { 3 String s="hello"; 4 String s1=new String("hello"); 5 String s2="world"; 6 String s3="helloworld"; 7 8 System.out.println(s==s1); 9 System.out.println(s.equals(s1)); 10 System.out.println(s3==s1+s2);
11 System.out.println(s3.equals(s1+s2)); 12 System.out.println(s3=="hello"+"world"); 13 System.out.println(s3.equals("hello"+"world")); 14 } 15 }

  通過上面的程式碼,應該可以發現:

    ==對比的是棧內的地址值,而equals對比的是方法區中的字串常量值。

  因此,eauals比較好理解,常量值即字面值,一眼就能看出來是否相等,難的是地址值的比較。

  首先,我們要理解常量值轉換為了字串的兩種方式有什麼區別?   

  String s = "hello"; 實際只有棧中建立了一個物件s,該物件直接指向方法區中的字串常量池。
  
  String s1 = new String("hello");除了在棧中建立了一個物件s1,還在堆中new了一個物件,
  s1先是指向new物件的地址值,new物件的地址值再指向方法區中的字串常量池。
  由此可見,s和s1的地址值是不同的,但字串常量值都是方法區中的同一個。

  其次,字串的拼接如何去理解?
    如果兩個字串是變數相加,那麼需要先開空間,再拼接,這個新開的空間就相當於是一個新的地址。
      比如s3 == s1+s2,新開空間的地址與s3的地址肯定不相等。
    如果兩個字串是常量相加,那麼常量值直接拼接,再去常量池中找對應的值,如果有就直接返回,否則就建立。
      比如s3 == "hello" + "world",兩個常量值拼接後就等於s3的常量池,所以兩者相等。