String、StringBuffer與StringBuilder之間區別

来源:http://www.cnblogs.com/mingfengshan/archive/2017/05/27/6912999.html
-Advertisement-
Play Games

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


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

  1.三者在執行速度方面的比較:StringBuilder >  StringBuffer  >  String

  2.String <(StringBuffer,StringBuilder)的原因

    String:字元串常量

    StringBuffer:字元創變數

    StringBuilder:字元創變數

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

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

 

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

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

  3.一個特殊的例子:

1 String str = “This is only a” + “ simple” + “ test”;
3 StringBuffer builder = 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會規規矩矩的按照原來的方式去做。

  4.StringBuilder與 StringBuffer

    StringBuilder:線程非安全的

    StringBuffer:線程安全的

    當我們在字元串緩衝去被多個線程使用是,JVM不能保證StringBuilder的操作是安全的,雖然他的速度最快,但是可以保證StringBuffer是可以正確操作的。當然大多數情況下就是我們是在單線程下進行的操作,所以大多數情況下是建議用StringBuilder而不用StringBuffer的,就是速度的原因。

 

           對於三者使用的總結: 1.如果要操作少量的數據用 = String

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

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


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

-Advertisement-
Play Games
更多相關文章
  • 一,效果圖。 二,工程圖。 三,代碼。 RootViewController.h RootViewController.m ...
  • 《NoSQL精粹》為考慮是否可以使用和如何使用NoSQL資料庫的企業提供了可靠的決策依據。它由世界軟體開發大師和軟體開發“教父”Martin Fowler與Jolt生產效率大獎圖書作者Pramod J. Sadalage共同撰寫。書中全方位比較了關係型資料庫與NoSQL資料庫的異同;分別以Riak、 ...
  • 一概述 1.什麼是Mybatis? ⑴Mybatis是Apache的一個開源項目,原名為ibatis,移植到google code後改名為Mybatis,目前遷移到了Github。 ⑵Mybatis是一個支持定製化SQL、存儲過程以及高級映射的優秀持久層框架,避免了幾乎所有的JDBC代碼、手動設置參 ...
  • 5. 圖的轉換操作 圖的轉換操作主要有以下的方法: (1) Graph.mapVertices():對圖的頂點進行轉換,返回一張新圖; (2) Graph.mapEdges():對圖的邊進行轉換,返回一張新圖。 代碼: 運行結果: 6. 圖的結構操作 圖的結構操作主要有: (1) Graph.sub ...
  • Itpub上遇到一個求助寫SQL的帖子,感覺很有意思,於是寫出來看看,要求如下: 於是建表插數據,表結構如下: 語句如下: 用到了nvl,case when,not in,over partition,sum,union,left join,with as等寫法,常年寫SQL的應該有更加效率的寫法, ...
  • 首先請確認正確安裝好MySQL. 1- 先配置環境變數path 1.1 打開終端,輸入: cd ~ 會進入~文件夾, 1.2 然後輸入:touch .bash_profile 回車執行後, 1.3 再輸入:open -e .bash_profile 會在TextEdit中打開這個文件(如果以前沒有配 ...
  • 《大數據時代》是國外大數據系統研究的先河之作,本書作者維克托.邁爾.舍恩伯格被譽為“大數據商業應用一人”,擁有在哈佛大學、牛津大學、耶魯大學和新加坡國立大學等多個互聯網研究重鎮任教的經歷,早在2010年就在《經濟學人》上發佈了長達14頁對大數據應用的前瞻性研究。 維克托.爾耶.舍恩伯格在本書中前瞻性 ...
  • 本文出處:http://www.cnblogs.com/wy123/p/6913055.html 執行計劃的緩存與重用 在通過SQL Profile觀察一個SQL語句或者存儲過程是否有可用的緩存執行計劃的時候,通過SP:CacheMiss和SP:CacheHit事件可以說明是否發生了編譯/重編譯和是 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...