首頁 Java java教程 Java中String、StringBuffer和StringBuilder的區別和堆疊記憶體分配的圖文介紹

Java中String、StringBuffer和StringBuilder的區別和堆疊記憶體分配的圖文介紹

Mar 04, 2017 am 09:33 AM

Java中的String類別是一個很常用,但最不注意其細節的類,因此大多數面試會那這個類做文章。例如String str = new String("hello");開啟了幾個記憶體空間,String和StringBuffer的差別等等。下面就做一個我的理解:

String是一個被final修飾的類,它是不能被繼承的。 StringBuffer也是被final修飾的類別。

一、JVM記憶體劃分

     在java中主要存在4塊內存,這些記憶體空間分別為:堆疊記憶體空間、堆疊記憶體空間、全域資料區、全域碼區

    1、堆疊記憶體空間:保存所有的物件名稱(保所了所引用的堆疊記憶體空間的位址)

    2、堆疊記憶體空間:儲存每個物件的特定內容

    3、全域資料區:儲存static類型的資料屬性(全域資料)

   4、全域程式碼區:儲存所有的方法定義






   在JVM中,堆疊記憶體是記憶體空間存放的是物件實例化的內容(程式的資料),堆疊記憶體存放的是物件的名稱,其內容是指向對應堆的位址。

也可以這麼說:所有的物件名稱都保存在堆疊記憶體中,而物件特定的內容則保持在堆疊記憶體中,引用類型資料必須使用new關鍵字來在堆疊記憶體中開闢空間。 #########二 、Sring的記憶體分配#########   String有一個特殊之處:建構String物件時可以使用new建構也可以使用"hello"直接建構。中兩種方法建議使用第二種。 ######    1、String a = "hello";  #########    2、 String a= new String("hello");######  說明如下:##### #####    1:在堆疊記憶體中定義了一個a物件引用,指向堆疊記憶體的值「hello」記憶體位址。最終開啟了一個記憶體空間###

    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";

      str的值不是也改變了嗎?

     其實上述程式碼在記憶體中已經開啟了3個空間,分別是:”hello“,”andy“, ”helloandy“,他們的堆內存大小是固定的,最終str指向了”helloandy“的堆地址。如下圖:

           

       而StringBuffer使用時,則只會開啟一塊記憶體空間,可使用append新增delete等作業內容。

      String 每次產生物件都會對系統效能產生影響,特別當記憶體中無引用物件多了以後, JVM 的 GC 就會開始運作,那速度是一定會相當慢的。   而如果是使用   StringBuffer/StringBuilder 類別則結果就不一樣了,每次結果都會對 StringBuffer/StringBuilder 物件本身進行操作,而不是產生 新的對象,然後再改變物件參考。

    
  因而在對一個字串循環賦值時,最好使用StringBuffer(線程安全)或StringBuilder,這樣可以節約內存,提高性能,切記

。               

 以上為Java中String、StringBuffer與StringBuilder的差異與堆疊記憶體分配的圖文所介紹的內容,並有更多相關內容請追蹤PHP中文網(www.php.cn)!


#
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1653
14
CakePHP 教程
1413
52
Laravel 教程
1306
25
PHP教程
1251
29
C# 教程
1224
24
使用java的String.valueOf()函數將基本資料型別轉換為字串 使用java的String.valueOf()函數將基本資料型別轉換為字串 Jul 24, 2023 pm 07:55 PM

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

怎麼把char數組轉string 怎麼把char數組轉string Jun 09, 2023 am 10:04 AM

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

stringbuilder清空的方法有哪些 stringbuilder清空的方法有哪些 Oct 12, 2023 pm 04:57 PM

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

Java中使用StringBuilder類別的delete()方法刪除字串中的部分內容 Java中使用StringBuilder類別的delete()方法刪除字串中的部分內容 Jul 26, 2023 pm 08:43 PM

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

使用java的String.replace()函數替換字串中的字元(字串) 使用java的String.replace()函數替換字串中的字元(字串) Jul 25, 2023 pm 05:16 PM

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

在Java中將字串轉換為StringBuilder 在Java中將字串轉換為StringBuilder Sep 02, 2023 pm 03:57 PM

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

Java文件解讀:StringBuilder類別的substring()方法詳細介紹 Java文件解讀:StringBuilder類別的substring()方法詳細介紹 Nov 03, 2023 pm 04:31 PM

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

Java如何使用StringBuilder類別的substring()函數截取字串的子字串 Java如何使用StringBuilder類別的substring()函數截取字串的子字串 Jul 24, 2023 pm 12:13 PM

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

See all articles