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:慧程教育 |