解決問題:
==和equals()的區別?
string在記憶體中的分配?
stringbuffer在記憶體中的分配?
+連線兩個字串後的記憶體情況?
+的底層原理是怎樣的?
(jdk1.7後常量池轉到堆中,畫圖沒考慮到,但意思、思路是正確的)
舉例子:(在某方法裡面。故宣告的物件放在棧)
總結:
1. string是不可變類,不能修改它,string s = "hello"會在常量池中查詢有無hello,沒有則建立乙個hello,如果再s = "world",那麼s將指向world而不是hello
2. 如果+連線兩個字串而形成的字串在字串常量池中可以查到,則直接指向它,否則在字串常量池中新建立該字串。
3. stringbuffer和string屬於不同的型別,也不能直接進行強制型別轉換,因為它們不是繼承關係。要通過stringbuffer的tostring()方法轉為string型別。
再說說==和equals()
1. ==可以進行基本資料型別的比較,或者引用型別的比較。引用型別的==比較的是位址值,比如上圖的0x1111等等
2. 而equals()只支援引用型別的比較,原始碼如下:
public boolean equals(object anobject)
if (anobject instanceof string)
return true;}}
return false;
}
它先比較位址值,如果位址值不一樣,再比較內容是否相同,
所以上面例子中,儘管s4和sb的位址值不一樣,它們的內容相同,s4==sb.tostring() ->false ; s4.equals(sb.tostring()) ->true;
+的底層原理是怎樣的呢?
例如:int i=2;
string s1 = "result" + i;
實際上在編譯後會生成以下**:
stringbuilder sb = new stringbuilder();
這個詳細請看:
由於使用+會new乙個stringbuilder,所以在使用多個+的情況下用stringbuilder去操作效率更高,因為只用了乙個stringbuilder。
(還有就是+支援兩端null,這是和concat()的乙個區別)
字串在記憶體中的儲存 C語言高階
字串是以ascii字元nul結尾的字串行。ascii字元nul表示為 0.字串通常儲存在陣列或者從堆上分配的記憶體中。只是,並不是全部的字元陣列都是字串,字元陣列可能沒有nul字元。字元陣列也用來表示布林值等小的整數單元,以節省記憶體空間。c中有兩種型別的字串 單位元組字串 由char資料型別組成的...
字串常量放在記憶體中的靜態儲存區
一 在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆 就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙...
關於字串常量在記憶體中的生命週期
字串char s hello 與char s hello 看似都是將hello字串的位址賦值給指標 p。但是前面乙個表示式是字串常量的位址賦值給指標 該指標指向的字串中的字元是不允許被更改的。而後面乙個表示式是將該字串的每乙個字元賦值給陣列,該指標指向的陣列的首位址,而陣列成員是變數,因此可以允許被...