Java中String、StringBuffer和StringBuilder的區別和堆疊記憶體分配的圖文介紹
Java中的String類別是一個很常用,但最不注意其細節的類,因此大多數面試會那這個類做文章。例如String str = new String("hello");開啟了幾個記憶體空間,String和StringBuffer的差別等等。下面就做一個我的理解:
String是一個被final修飾的類,它是不能被繼承的。 StringBuffer也是被final修飾的類別。
一、JVM記憶體劃分
在java中主要存在4塊內存,這些記憶體空間分別為:堆疊記憶體空間、堆疊記憶體空間、全域資料區、全域碼區
1、堆疊記憶體空間:保存所有的物件名稱(保所了所引用的堆疊記憶體空間的位址)
2、堆疊記憶體空間:儲存每個物件的特定內容
3、全域資料區:儲存static類型的資料屬性(全域資料)
4、全域程式碼區:儲存所有的方法定義
2:在堆疊記憶體重定義了一個a物件引用,先指向堆疊記憶體值為「hello」記憶體位址,然後再指向new之後堆疊記憶體為「hello」的位址。最後開啟了兩個空間,第一個空間沒有物件引用,會被JVM垃圾回收。
圖示如下:
理解上面的程式碼就不難理解以下這些程式碼:
package andy.string.test; /** * @author Zhang,Tianyou * version:2014-11-25 下午4:15:14 * * */ public class TestString { public static void main(String[] args){ String a = "hello"; String b = "hello"; String c = new String("hello"); String d = new String(); d = "hello"; String e = c; System.out.println("a==b ? " + (a== b)); System.out.println("a==c ? " + (c== b)); System.out.println("a==d ? " + (a== d)); System.out.println("a==e ? " + (a== e)); System.out.println("c==d ? " + (c== d)); System.out.println("c==e ? " + (c== e)); } }
##其中只有a==b==d 、 c=e。
解釋:
1、String每new一次堆記憶體不想等,而d在new分配完新位址之後,又放棄new之後的位址,指向a對應的記憶體位址,所以他們是相同的。
2、「hello」賦值此直接賦值方式所指向的堆疊記憶體空間是一樣的。 String在Java中使用了共享設計,在Java形成一個物件池,這個物件池可以保存多個對象,如果新實例化的物件已經在物件池中存在,就不在重複定義,直接從物件池中取出使用。所 以
存在的內容時,且將物件指向已執行實例的空間位址。
3、e直接指向C的記憶體空間。
4、因此使用String時,建議使用直接賦值方式,以縮小記憶體空間,提升效能。
三、String、StringBuffer和StringBuilder的區別
1、 String、StringBuffer、StringBuilder都是被final修飾的,是不能夠被繼承改寫的。
2、 String在實例化之後,其記憶體空間的內容大小是不能夠被修改的;而StringBuffer是一個線程安全的可變字元序列,在實例化之後可以動態的修改堆記憶體中的內容,所以記憶體長度和大小是可變的;StringBuilder實例化之後記憶體大小長度也是可變的,不
相同之處在於StringBuilder不是執行緒同步,因此操作起來必然比StringBuffer更有效率。
這是有人會想:
str += "andy";
而StringBuffer使用時,則只會開啟一塊記憶體空間,可使用append新增delete等作業內容。
因而在對一個字串循環賦值時,最好使用StringBuffer(線程安全)或StringBuilder,這樣可以節約內存,提高性能,切記
以上為Java中String、StringBuffer與StringBuilder的差異與堆疊記憶體分配的圖文所介紹的內容,並有更多相關內容請追蹤PHP中文網(www.php.cn)!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

使用Java的String.valueOf()函數將基本資料型別轉換為字串在Java開發中,當我們需要將基本資料型別轉換為字串時,常見的方法是使用String類別的valueOf()函數。這個函數可以接受基本資料類型的參數,並傳回對應的字串表示。在本文中,我們將探討如何使用String.valueOf()函數進行基本資料型別轉換,並提供一些程式碼範例來

char陣列轉string的方法:可以透過賦值來實現,使用{char a[]=" abc d\0efg ";string s=a;}語法,讓char陣列對string直接賦值,執行程式碼即可完成轉換。

stringbuilder清空的方法有:1、使用setLength(0)方法清空StringBuilder物件;2、使用delete(0, length)方法清空StringBuilder物件;3、使用replace(0, length, "")方法清空StringBuilder物件;4 、使用new StringBuilder()重新建立一個新的StringBuilder物件。

Java中使用StringBuilder類別的delete()方法刪除字串中的部分內容String類別是Java中常用的字串處理類,它具有許多常用的方法可用於字串的操作。然而,在某些情況下,我們需要對字串進行頻繁的修改,而String類別的不可變性會導致頻繁的創建新的字串對象,從而影響效能。為了解決這個問題,Java提供了StringBuilder類,它

使用Java的String.replace()函數替換字串中的字元(字串)在Java中,字串是不可變的對象,這意味著一旦創建了一個字串對象,就無法修改它的值。但是,你可能會遇到需要替換字串中的某些字元或字串的情況。這時候,我們可以使用Java的String類別中的replace()方法來實作字串的替換。 String類別的replace()方法有兩種重

StringBuilder類別的append()方法接受String值並將其新增至目前物件。將字串值轉換為StringBuilder物件-取得字串值。附加使用append()方法將字串取得到StringBuilder。範例在下面的Java程式中,我們是將字串陣列轉換為單一StringBuilder物件。 即時示範publicclassStringToStringBuilder{ publicstaticvoidmain(Stringargs[]){&a

Java文件解讀:StringBuilder類別的substring()方法詳細介紹引言:在Java程式設計中,字串的處理是非常常見的操作之一。而Java提供了一系列關於字串處理的類別和方法,其中StringBuilder類別是常用於頻繁字串操作的選擇。在StringBuilder類別中,substring()方法是一個非常有用的方法,用來截取字串的子字串。本文將

Java如何使用StringBuilder類別的substring()函數截取字串的子字串在Java中,我們經常需要處理字串的運算。而Java的StringBuilder類別提供了一系列的方法,方便我們對字串進行操作。其中,substring()函數可以用來截取字串的子字串。 substring()函數有兩種重載形式,分別是substring(intstar
