String、StringBuffer與StringBuilder比較

来源:http://www.cnblogs.com/peke/archive/2017/12/15/8044635.html
-Advertisement-
Play Games

關於這三個類在字元串處理中的位置不言而喻,那麼他們到底有什麼優缺點,到底什麼時候該用誰呢?下麵我們從以下幾點說明一下 1、三者在執行速度方面的比較: StringBuilder > StringBuffer > String 為什麼String的執行速度最慢? String:字元串常量 String ...


  關於這三個類在字元串處理中的位置不言而喻,那麼他們到底有什麼優缺點,到底什麼時候該用誰呢?下麵我們從以下幾點說明一下

 

1、三者在執行速度方面的比較:

    StringBuilder > StringBuffer  >  String

 為什麼String的執行速度最慢?

        String:字元串常量

        StringBuffer:字元串變數

        StringBuilder:字元串變數

從上面的名字可以看到,String是“字元串常量”,也就是不可改變的對象。對於這句話的理解你可能會產生這樣一個疑問  ,比如這段代碼:

 

Strings = "abcd";
s= s+1;
System.out.print(s);
//result : abcd1

 

  我們明明就是改變了String型的變數s的,為什麼說是沒有改變呢?

         其實這是一種欺騙,JVM是這樣解析這段代碼的:首先創建對象s,賦予一個abcd,然後再創建一個新的對象s用來執行第二行代碼.

         也就是說我們之前對象s並沒有變化,所以我們說String類型是不可改變的對象了。

         由於這種機制,每當用String操作字元串時,實際上是在不斷的創建新的對象,而原來的對象就會變為垃圾被GC回收掉,可想而知這樣執行效率會有多底。

         而StringBuffer與StringBuilder就不一樣了,他們是字元串變數,是可改變的對象.每當我們用它們對字元串做操作時,實際上是在一個對象上操作的,這樣就不會像String一樣創建一些而外的對象進行操作了,當然速度就快了。

 

一個特殊的例子:

 

Stringstr = “This is only a” + “ simple” + “ test”;
StringBufferbuilder = new StringBuilder(“This is only a”)
.append(“ simple”).append(“test”);

        你會很驚訝的發現,生成str對象的速度簡直太快了,而這個時候StringBuffer居然速度上根本一點都不占優勢。其實這是JVM的一個把戲,實際上:

String str = “This is only a” + “ simple” + “test”;

其實就是:

String str = “This is only a simple test”;

所以不需要太多的時間了。但大家這裡要註意的是,如果你的字元串是來自另外的String對象的話,速度就沒那麼快了,譬如:

 

String str2 = “This is only a”;
String str3 = “ simple”;
String str4 = “ test”;
String str1 = str2 +str3 + str4;

 

這時候JVM會規規矩矩的按照原來的方式去做。

 

2、StringBuilder與 StringBuffer比較

        StringBuilder:線程非安全的

        StringBuffer:線程安全的

        當我們在字元串緩衝去被多個線程使用是,JVM不能保證StringBuilder的操作是安全的,雖然他的速度最快,但是可以保證StringBuffer是可以正確操作的。

        當然大多數情況下就是我們是在單線程下進行的操作,所以大多數情況下是建議用StringBuilder而不用StringBuffer的,就是速度的原因。

 

3、對於三者使用的總結

        1.如果要操作少量的數據用String

        2.單線程操作字元串緩衝區 下操作大量數據用StringBuilder

        3.多線程操作字元串緩衝區 下操作大量數據用StringBuffer

 

4、(擴展)關於StringBuilder和StringBuffer擴容的問題

首先,查看一下二者的繼承體系,都繼承自抽象類AbstractStringBuilder

    下麵是AbstractStringBuilder類的有參數構造器

 

Abstract StringBuilder(int capacity){  
      value = new char[capacity];  
}

 

    在新建StringBuilder和StringBuffer的會後都會調用父類的構造器,預設長度為16

 

public StringBuilder() {  
     super(16);  
}  
 public StringBuffer() {  
     super(16);  
}

 

    有參數構造器

 

public StringBuffer(String str) {  
   super(str.length() + 16);  
   append(str);  
}

 

再說他們如何擴容

         使用append()方法在字元串後面追加方法的時候,如果長度超過了字元串的存儲空間,就需要擴容。

         擴容的方式就是構建新的字元串將新的複製過去,在進行字元串append添加的時候,會先計算添加後字元串大小,

         傳入一個方法:ensureCapacityInternal這個方法進行是否擴容的判斷,需要擴容就調用expandCapacity方法進行擴容:

 

void expandCapacity(int minimumCapacity) {  
     int newCapacity = value.length * 2 + 2; 
     if (newCapacity - minimumCapacity < 0)  
           newCapacity =minimumCapacity;  
     if (newCapacity < 0) {  
         if (minimumCapacity < 0) //overflow  
               throw new OutOfMemoryError();  
         newCapacity =Integer.MAX_VALUE;  
     }  
   value = Arrays.copyOf(value, newCapacity);  
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大多數人選擇Java可能只是因為聽說Java前景好、Java比較好找工作、Java語言在TIOBE排行榜上一直位於前三等等之類的原因,但是Java具體好在哪裡,心裡卻是沒有什麼概念的。本文為你解答學Java的前景。 一、Java工程師發展前景 作為一種最流行的網路編程語言之一,java語言在當今信息 ...
  • 在高性能的IO體系設計中,有幾個名詞概念常常會使我們感到迷惑不解。具體如下: 1 什麼是同步? 2 什麼是非同步? 3 什麼是阻塞? 4 什麼是非阻塞? 5 什麼是同步阻塞? 6 什麼是同步非阻塞? 7 什麼是非同步阻塞? 8 什麼是非同步非阻塞? 先來舉個實例生活中的例子: 如果你想吃一份宮保雞丁蓋飯: ...
  • Unexpected exception thrown when create new site: Solution: The doubling was caused by the Counter service (not sure what it actually does but assume ...
  • puts是print string的縮寫。儘管沒有直觀的表示會調用換行符,但是puts會這樣做:如同print,列印用戶的數據,之後自動地轉到新一行。假如讓puts列印已經以換行符結束的一行,它不會再次添加換行符。 ...
  • 一、前言 Python的select()方法直接調用操作系統的IO介面,它監控sockets,open files, and pipes(所有帶fileno()方法的文件句柄)何時變成readable 和writeable, 或者通信錯誤,select()使得同時監控多個連接變的簡單,並且這比寫一個 ...
  • 下載: 鏈接: https://pan.baidu.com/s/1gfMYeGF 密碼: 45bn 打開目錄:E:\Delphi7\TRichView.v.16.10.3 ScaleRichView.v.7.7.2 Full Source D4-RAD10.2 2016-05-19 and Fix ...
  • mybatis map文件中 resultMap中column和sql查詢結果對應, property和實體private對應 <sql id="Base_Column_List_Video_App"> c.CarId,v.VideoId,v.Title,v.TotalVisit,v.TotalCo ...
  • python 中如何不同的項目使用不同版本的依賴包, 如何自動生成依賴包信息併在更換電腦後快速恢復項目的開發環境 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...