Java中String物件建立
文章目錄
在開始之前我沒了解一下什麼叫做字串駐留。
當同時建立多個相同的字串直接量是,只有一個字串常量被儲存在執行時常量池中。
如:
String a="abc";
String b="abc";
//String c=new String("abc");
此時同時建立了兩個String物件(用雙引號的方式),此時在執行時常量池中只有一個"abc"。對於String c=new String(“abc”),可以通過c.intern()獲取c在執行時常量池裡面的字串駐留物件"abc",所以
String a=new String("abc");
String b=new String("abc");
System.out.println(a==b);//false
System.out.println( a.intern()==b.intern());//true
1 String a="abc"與String b=new String(“abc”)一樣嗎,難道也是語法糖???
首先是不一樣的,不是語法糖。我們看一下以下程式碼:
public static void main(String[] args) {
String a="abc";
String b="abc";
String c=new String("Hello world");
String d=new String("abc");
int length="abc". length();
}
位元組碼:
從位元組碼中可以看到,String a=“abc"只建立了一個物件(就是”abc”,在執行時常量池)。然而String a=new String(“abc”)會建立額外的物件,看見new沒有(意思是在堆上有建立了一個物件)。
a,b兩個物件都是用ldc指令將常量"abc"(本身就是一個String型別)載入進運算元棧的,所以a==b是true。然而String d=new String(“abc”)會在堆中新new一個String物件,所以d==b為false。
通常建立String物件時,推薦使用雙引號這種方式。因為new的方式會額外建立一個物件。
2 String a="abc"要建立幾個物件??
通過上面的解釋,現在我們就知道了String a=“abc"會建立一個物件(在執行時常量池),而String a=new String(“abc”)會建立兩個物件(一個在執行時常量池的"abc”,一個在堆裡面)。需要注意的是這是在String a="abc"與String a=new String(“abc”)不同時出現的情況下。
3 String a=“abc”;String b=new String(“abc”)又要建立幾個物件???
其實理解上面的這個就好懂了。此時,String a="abc"與String b=new String(“abc”)是同時出現的。那麼總共會建立2個物件。
首先String a="abc"在執行時常量池中建立了一個物件。而當String b=new String(“abc”)時,已經知道了執行時常量池中有一個物件"abc"了,那當然就不用在常量池中新建立一個“abc”咯!。只用在堆中建立一個物件就行了。
4 String a=“abc”;String b=“abc”;那麼a==b嗎???
那當然為true哦。正如前面所講的,a與b都指向了執行時常量池中的"abc",所以那當然為true了。