當前位置:
首頁 > 最新 > String、StringBuffer、StringBuilder的區別?

String、StringBuffer、StringBuilder的區別?

在學習Java過程中,字元串是我們在早期就會接觸到的一個概念。而後隨之我們便學習了有關字元串的幾個類。通常情況下,我們都會接觸到以下幾個跟字元串相關的類:

String、StringBuffer、StringBuilder

這三個類在java中跟字元串都息息相關。

String: 字元串常量

StringBuffer:字元串變數

StringBuilder:字元串變數

1.

>>>可變與不可變

String類中使用字元數組保存字元串,如下就是,因為有「final」修飾符,所以可以知道string對象是不可變的。

private final char value[];

看上去我們明明就是改變了String型的變數s的,為什麼說是沒有改變呢? 其實這是一種欺騙,JVM是這樣解析這段代碼的:首先創建對象s,賦予一個hello,然後再創建一個新的對象s用來執行第二行代碼,也就是說我們之前對象s並沒有變化,所以我們說String類型是不可改變的對象了,由於這種機制,每當用String操作字元串時,實際上是在不斷的創建新的對象,而原來的對象就會變為垃圾被GC回收掉,可想而知這樣執行效率會有多低。

2.

>>>是否多線程安全

String中的對象是不可變的,也就可以理解為常量,顯然線程安全

AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字元串的基本操作,如append、insert、indexOf等公共方法。

StringBuffer中的方法都加了 Synchronized 關鍵字修飾,對方法進行了同步,所以是線程安全的。

StringBuilder卻沒有對方法進行同步,所以是非線程安全的。

·

·

·

·

·

·

·

·

綜上所述:

所以在操作上的效率應該是

StringBuilder > StringBuffer > String.

·

·

·

·

·

·

·

·

最後簡單進行一個總結:

如果只是使用字元串,而不對其進行改變的操作,建議使用 String 類。

沒有考慮線程安全的問題的話,建議使用 StringBuilder類。

多線程情況下,建議使用StringBuffer類。

最後提一下,在面試時,經常被問到 String a = new String(「abc」); 一個創建了幾個對象?

答案是:如果在這句代碼前,沒有其他特別的操作,答案是兩個:

一個字元串常量對象「abc」,在方法區的常量池裡面。

另一個是引用類型String,在堆空間中,只是其值為常量池中的「abc」。

郭歡洋

Java+大數據高級講師

從事過多項電商行業的項目開發,曾參與開發了匠人之心,質監抽檢,青歷商城等諸多大型系統網站。3年的JavaEE開發經驗,3年Java教學經驗,對常見的各種企業應用領域非常熟悉。 擅長JavaEE方向技術:包括Spring、Hibernate、MyBatis、Spring MVC、Struts2等開源框架,Oracle、MySQL、SQL Server等關係型資料庫技術,HTML,CSS,JavaScript,jQuery等前端技術。

有豐富的項目經驗,善於拆分項目融入課堂與學生一起完成對應的小功能模塊,教學能力強,授課風格幽默風趣,內容豐富充實,善於結合工作、生活中的實際案例來帶入學習,通過層層引導和深入淺出的方式加深學生對知識點的認識和理解,一個輕鬆活躍的課堂氣氛,又不失專業技術知識的講解,讓學生覺得學習也是一件快樂的事。

群內將不定時的開設在線教學課程

前100名入群者,免收課時費

預聽從速!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 慧程教育 的精彩文章:

TAG:慧程教育 |