老掉牙的問題:
1.string s1 = "abc";
2.string s2 = new string("abc");
3.string s3 = new string();
s3 = "abc";
以上三者順序執行,分別建立了幾個物件,哪些物件用==運算子,結果返回true?
下面我們來乙個乙個分析
字串有別於其他的基本資料型別,它屬於物件(引用)型別。在記憶體中會為其單開乙個儲存區--字串常量池,用來儲存這些字串。
1.虛擬機器jvm在讀取到1的**時,首先去字串常量池查詢,是否有「abc」,如果有則將該字串的位址引用返回給棧中變數s1,如果沒有,則會建立乙個字串物件「abc」,並將該物件的位址引用返回給s1.
單就本題來看,1中建立了乙個物件
2.jvm在讀取到2的**時,會分兩個步驟走,第一步類似1,如果有「abc」,則將該字串常量的位址引用傳遞給堆中由new關鍵字新建的一塊記憶體區(類似於將其拷貝乙份,存放到新建堆中),然後將堆記憶體位址引用傳遞給棧中變數s2。如果沒有「abc」,則會新建乙個字串物件「abc」,然後將新建字串物件放進字串常量池中,並將該物件位址引用傳遞給由new關鍵字新建的一塊記憶體區。接著將堆記憶體位址引用傳遞給s2.
就本題而言,2中建立了1個物件
3.jvm在讀取到3的**時,會先通過new關鍵字,在堆記憶體中為新建的物件分配乙個儲存區,並將該儲存區位址引用傳遞給棧中變數s3。然後會檢視字串常量池中是否存在字串「abc」,如果存在,則將該字串的位址引用傳遞給棧變數s3。如果不存在,則會在字串常量池中建立該字串物件「abc」,再而將該物件位址引用傳遞給s3.
本題中,3中建立了1個物件
s1==s2 --false
s1==s3 --true
s2==s3 --false
新手之言,如有錯誤和不妥之處,望各位多多指教,不甚感激~~~
o(∩_∩)o~
java 原始碼學習1 String
1 計算hashcode方法 public int hashcode hash h return h 假設現在又 abcd 的字串 則h 0 31 a 31 b 31 c 31 d 最後得到的表示式 是 a 31 4 1 b 31 4 2 c 31 4 3 d 可以簡單理解為 計算31進製的資料。這...
小白學習筆記C 高階 1 string字串
1.定義string型別字串,查詢字串長度,字串連線,索引器訪問字串字元,static void main string args else a tschaikowsky a char b a 2 字元查詢 for int i 0 i a.length i int c a.compareto lal...
標準庫型別基礎(1) string
0 都已包含響應庫函式並已進行using宣告。1 string初始化 string s1 預設建構函式,s1為空字串 string s2 s1 將s2初始化為s1的乙個副本 string s3 value 將s3初始化為乙個字串字面值副本 string s4 n,c 將s4初始化為字元 c 的n個副...