一.String類
String 表示一個字符串,內部使用字符數組實現,該類不可變
二.存儲
上圖爲下列語句執行的內存存儲過程:
String S1 = “糞糞”;
String S2 = new String(“糞糞”);
String S3 = “糞糞”;
三.String實例(註釋很詳細):
public class StringDemo {
public static void main(String[] args) {
//String 的兩種賦值方式的分析,推薦第一種
//1.直接賦值
String S1 = "糞糞";
//2.使用new關鍵字創建對象 new :表示在堆中申請內存空間,強制型的一個操作
//面試題:下面語句創建了幾個對象? --->1個
String S2 = new String("糞糞");
System.out.println(S1==S2);//比較指向的地址,返回false
//String 類在運行期和編譯期的分析
String S3 = "糞糞"; //常量池已有"糞糞",所以不會再創建對象,直接指向,省了內存空間
System.out.println(S1==S3); //在常量池中找,所以會返回true
System.out.println("-----------我是可愛的分割線---------");
//4種情況分析:直接賦值,字符串連接時,分析編譯器和運行期
//如果在編譯期值可以被確定,那就使用已有的對象,否則會創建新的對象
String a = "a";//編譯時可以確定,所以直接把變量a替換成"a"
String a1 = a+1;//編譯時語句是一句一句來的,會把a當成是變量,不可以確定,變量在運行的時候纔有值,上一句跑了,a纔有值,然後a1纔會爲"a1",
//所以這句話會在堆中創建一個a1對象
String a2 = "a1";//這句則在常量池中創建一個"a1",因此a1==a2 :false
System.out.println(a1==a2);
final String b="b";
String b1=b+"1"; //編譯期b到這裏已替換,1加不加雙引號無所謂,final纔可以,沒有final就還是變量
String b2 = "b1";
System.out.println(b1==b2);//true
String c = getC(); //注意,方法只有在運行期才能得到結果
String c1 = c+1;
String c2 = "c1";
System.out.println(c1==c2); //false
final String d = getD();
String d1 = d+1;
String d2 = "d1";
System.out.println(d1==d2);//還是false,因爲雖然d是final,但方法只有在運行時纔有返回結果,因此一樣是false
}
private static String getC(){
return "c";
}
private static String getD(){
return "d";
}
}
輸出:
false
true
———–我是可愛的分割線———
false
true
false
false