Java中的String類
阿新 • • 發佈:2020-08-22
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 { 2public 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的常量池,所以兩者相等。