String直接賦值和使用new的區別

2022-10-10 18:45:13 字數 1134 閱讀 6488

string str2 = new string("abc");

上面語句建立了幾個字串物件?上面語句實際上建立了2個字串物件,乙個是「abc」這個直接量對應的物件,乙個是new string()構造器返回的字串物件。

在jvm裡,考慮到垃圾**(garbage collection)的方便,將heap(堆)劃分為三部分:young generation(新生代)、tenured generation (old generation)(舊生代)、permanent generation(永生代)。

字串為了解決字串重複問題,生命週期長,存於pergmen中。

string str1 = 「abc」;可能建立乙個或者不建立物件,如果」abc」這個字串在j**a string池裡不存在,會在jvm的字串池裡建立乙個建立乙個string物件(「abc」),然後str1指向這個記憶體位址,無論以後用這種方式建立多少個值為」abc」的字串物件,始終只有乙個記憶體位址被分配,之後的都是string的拷貝,j**a中稱為「字串駐留」,所有的字串常量都會在編譯之後自動地駐留。

string str2 = new string(「abc」);至少建立乙個物件,也可能兩個。因為用到new關鍵字,肯定會在heap中建立乙個str2的string物件,它的value是「abc」。同時如果這個字串再j**a string池裡不存在,會在j**a池裡建立這個string物件「abc」。

public

class

test2

}

如果將乙個字串連線表示式賦給字串變數,如果這個字串連線表示式的值可以在編譯時就確定下來,那麼jvm會在編譯時確定字串變數的值,並讓它指向字串池中對應的字串。

但是如果程式使用了變數或者呼叫了方法,那就只有在執行時才能確定該字串表示式的值,因此無法在編譯時確定值,無法利用jvm的字串池。

public

class

test2

}

當程式中需要使用字串、基本資料型別包裝例項時,應該盡量使用字串直接量、基本資料型別的直接量,避免通過new string()、new integer()等形式來建立字串、基本資料型別包裝類例項,這樣能保證較好的效能。

String直接賦值和new物件的區別

string直接賦值和new物件的區別 string s hello world string s new string hello world 首先string s hello world 是賦值語句,它會先在常量池查詢是否有這個值,如果有,就將這個位址賦值給s,如果沒有就在常量池開一塊空間給he...

String直接賦值和new乙個物件的理解

我們直接來看兩句 string str1 new string abc string str2 abc system.out.println str1 str2 輸出false 首先,既然有new這個關鍵字,那麼一定要在堆記憶體中開闢空間,存放資料。所以 str1 指向的是堆記憶體中的一片區域,而s...

使用String逐個賦值字元

include include using namespace std int main include include using namespace std int main include include using namespace std int main 實驗結果如圖所示 string...