java 掌握字串在記憶體中的分配

2021-09-10 07:30:30 字數 1681 閱讀 3963

解決問題:

==和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。但是前面乙個表示式是字串常量的位址賦值給指標 該指標指向的字串中的字元是不允許被更改的。而後面乙個表示式是將該字串的每乙個字元賦值給陣列,該指標指向的陣列的首位址,而陣列成員是變數,因此可以允許被...