欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java那點事——StringBuffer與StringBuilder原理與區(qū)別

 更新時間:2016年06月14日 10:30:34   作者:jmatrix  
本文給大家分享StringBuffer與StringBuilder的區(qū)別,它們的應(yīng)用場景是什么?非常不錯,面試考官經(jīng)??嫉囊粋€問題,有需要的朋友跟著腳本之家小編一起學(xué)習(xí)吧

最近在找工作,考官問我一個簡單的題目:“StringBuffer與StringBuilder的區(qū)別,它們的應(yīng)用場景是什么?”,下面小編答案分享給大家,方便以后大家學(xué)習(xí),以此也做個備錄。

其實只要找下Google大神就有答案了:StringBuffer 與 StringBuilder 中的方法和功能完全是等價的,只是StringBuffer 中的方法大都采用了 synchronized 關(guān)鍵字進行修飾,因此是線程安全的,而 StringBuilder 沒有這個修飾,可以被認(rèn)為是線程不安全的。

為了更好的理解上述的答案,還是直接看StringBuffer與StringBuilder的源碼實現(xiàn)比較實在,作為一個程序猿,“有疑問,看源碼”才是正道,我可以負責(zé)任的說,當(dāng)然了得有條件才行!

jdk的實現(xiàn)中StringBuffer與StringBuilder都繼承自AbstractStringBuilder,對于多線程的安全與非安全看到StringBuffer中方法前面的一堆synchronized就大概了解了。

這里隨便講講AbstractStringBuilder的實現(xiàn)原理:我們知道使用StringBuffer等無非就是為了提高java中字符串連接的效率,因為直接使用+進行字符串連接的話,jvm會創(chuàng)建多個String對象,因此造成一定的開銷。AbstractStringBuilder中采用一個char數(shù)組來保存需要append的字符串,char數(shù)組有一個初始大小,當(dāng)append的字符串長度超過當(dāng)前char數(shù)組容量時,則對char數(shù)組進行動態(tài)擴展,也即重新申請一段更大的內(nèi)存空間,然后將當(dāng)前char數(shù)組拷貝到新的位置,因為重新分配內(nèi)存并拷貝的開銷比較大,所以每次重新申請內(nèi)存空間都是采用申請大于當(dāng)前需要的內(nèi)存空間的方式,這里是2倍。

接下來,玩些好玩的!

在Google中出來了這么一些信息:


StringBuffer 始于 JDK 1.0
StringBuilder 始于 JDK 1.5

從 JDK 1.5 開始,帶有字符串變量的連接操作(+),JVM 內(nèi)部采用的是
StringBuilder 來實現(xiàn)的,而之前這個操作是采用 StringBuffer 實現(xiàn)的。

我們通過一個簡單的程序來看其執(zhí)行的流程:

清單1 Buffer.java

public class Buffer { 
public static void main(String[] args) { 
String s1 = "aaaaa"; 
String s2 = "bbbbb"; 
String r = null; 
int i = 3694; 
r = s1 + i + s2; 

for(int j=0;i<10;j++){ 
r+="23124"; 
} 
} 
} 

使用命令javap -c Buffer查看其字節(jié)碼實現(xiàn):

清單2 Buffer類字節(jié)碼

將清單1和清單2對應(yīng)起來看,清單2的字節(jié)碼中l(wèi)dc指令即從常量池中加載“aaaaa”字符串到棧頂,istore_1將“aaaaa”存到變量1中,后面的一樣,sipush是將一個短整型常量值(-32768~32767)推送至棧頂,這里是常量“3694”,更多的Java指令集請查看另一篇文章“Java指令集”。

讓我們直接看到13,13~17是new了一個StringBuffer對象并調(diào)用其初始化方法,20~21則是先通過aload_1將變量1壓到棧頂,前面說過變量1放的就是字符串常量“aaaaa”,接著通過指令invokevirtual調(diào)用StringBuffer的append方法將“aaaaa”拼接起來,后續(xù)的24~30同理。最后在33調(diào)用StringBuffer的toString函數(shù)獲得String結(jié)果并通過astore存到變量3中。

看到這里可能有人會說,“既然JVM內(nèi)部采用了StringBuffer來連接字符串了,那么我們自己就不用用StringBuffer,直接用”+“就行了吧!“。是么?當(dāng)然不是了。俗話說”存在既有它的理由”,讓我們繼續(xù)看后面的循環(huán)對應(yīng)的字節(jié)碼。

37~42都是進入for循環(huán)前的一些準(zhǔn)備工作,37,38是將j置為1。44這里通過if_icmpge將j與10進行比較,如果j大于10則直接跳轉(zhuǎn)到73,也即return語句退出函數(shù);否則進入循環(huán),也即47~66的字節(jié)碼。這里我們只需看47到51就知道為什么我們要在代碼中自己使用StringBuffer來處理字符串的連接了,因為每次執(zhí)行“+”操作時jvm都要new一個StringBuffer對象來處理字符串的連接,這在涉及很多的字符串連接操作時開銷會很大。

相關(guān)文章

  • JavaEE SpringMyBatis是什么? 它和Hibernate的區(qū)別及如何配置MyBatis

    JavaEE SpringMyBatis是什么? 它和Hibernate的區(qū)別及如何配置MyBatis

    這篇文章主要介紹了JavaEE Spring MyBatis是什么? 它和Hibernate的區(qū)別有哪些?如何配置MyBatis?本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • struts升級到2.5.2遇到的問題及解決方案(推薦)

    struts升級到2.5.2遇到的問題及解決方案(推薦)

    原來的版本是2.3.x,由于安全原因需要升級到2.5.2。但是在升級過程中遇到各種各樣的問題,下面小編給大家?guī)砹藄truts升級到2.5.2遇到的問題及解決方案,需要的朋友參考下吧
    2016-11-11
  • Java并發(fā)工具類之CountDownLatch詳解

    Java并發(fā)工具類之CountDownLatch詳解

    這篇文章主要介紹了Java并發(fā)工具類之CountDownLatch詳解,CountDownLatch可以使一個獲多個線程等待其他線程各自執(zhí)行完畢后再執(zhí)行,CountDownLatch可以解決那些一個或者多個線程在執(zhí)行之前必須依賴于某些必要的前提業(yè)務(wù)先執(zhí)行的場景,需要的朋友可以參考下
    2023-12-12
  • mybatis實現(xiàn)查詢操作及獲得添加的ID

    mybatis實現(xiàn)查詢操作及獲得添加的ID

    這篇文章主要介紹了mybatis實現(xiàn)查詢操作及獲得添加的ID,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-11-11
  • 詳解SpringMVC中設(shè)置靜態(tài)資源不被攔截的問題

    詳解SpringMVC中設(shè)置靜態(tài)資源不被攔截的問題

    這篇文章主要介紹了詳解SpringMVC中設(shè)置靜態(tài)資源不被攔截的問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • SpringBoot使用JWT實現(xiàn)登錄驗證的方法示例

    SpringBoot使用JWT實現(xiàn)登錄驗證的方法示例

    這篇文章主要介紹了SpringBoot使用JWT實現(xiàn)登錄驗證的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • java ThreadLocal?類常用方法源碼解析

    java ThreadLocal?類常用方法源碼解析

    這篇文章主要為大家介紹了java ThreadLocal類常用方法源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 完美解決java.lang.OutOfMemoryError處理錯誤的問題

    完美解決java.lang.OutOfMemoryError處理錯誤的問題

    下面小編就為大家?guī)硪黄昝澜鉀Qjava.lang.OutOfMemoryError處理錯誤的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Java?通過手寫分布式雪花SnowFlake生成ID方法詳解

    Java?通過手寫分布式雪花SnowFlake生成ID方法詳解

    SnowFlake是twitter公司內(nèi)部分布式項目采用的ID生成算法,開源后廣受國內(nèi)大廠的好評。由這種算法生成的ID,我們就叫做SnowFlakeID,下面我們來詳細看看
    2022-04-04
  • SpringBoot進行Web開發(fā)的實現(xiàn)

    SpringBoot進行Web開發(fā)的實現(xiàn)

    Spring?Boot讓我們可以快速構(gòu)建項目并運行web應(yīng)用,大大簡化了Spring的復(fù)雜配置,本文主要介紹了SpringBoot進行Web開發(fā)的實現(xiàn),感興趣的可以了解一下
    2023-10-10

最新評論