(轉)String,StringBuffer與StringBuilder的區別??

来源:http://www.cnblogs.com/lm970585581/archive/2017/05/16/6860470.html
-Advertisement-
Play Games

String 字元串常量StringBuffer 字元串變數(線程安全)StringBuilder 字元串變數(非線程安全) 簡要的說, String 類型和 StringBuffer 類型的主要性能區別其實在於 String 是不可變的對象, 因此在每次對 String 類型進行改變的時候其實都等 ...


String 字元串常量
StringBuffer 字元串變數(線程安全)
StringBuilder 字元串變數(非線程安全)

 簡要的說, String 類型和 StringBuffer 類型的主要性能區別其實在於 String 是不可變的對象, 因此在每次對 String 類型進行改變的時候其實都等同於生成了一個新的 String 對象,然後將指針指向新的 String 對象,所以經常改變內容的字元串最好不要用 String ,因為每次生成對象都會對系統性能產生影響,特別當記憶體中無引用對象多了以後, JVM 的 GC 就會開始工作,那速度是一定會相當慢的。
 而如果是使用 StringBuffer 類則結果就不一樣了,每次結果都會對 StringBuffer 對象本身進行操作,而不是生成新的對象,再改變對象引用。所以在一般情況下我們推薦使用 StringBuffer ,特別是字元串對象經常改變的情況下。而在某些特別情況下, String 對象的字元串拼接其實是被 JVM 解釋成了 StringBuffer 對象的拼接,所以這些時候 String 對象的速度並不會比 StringBuffer 對象慢,而特別是以下的字元串對象生成中, String 效率是遠要比 StringBuffer 快的:
 String S1 = “This is only a” + “ simple” + “ test”;
 StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
 你會很驚訝的發現,生成 String S1 對象的速度簡直太快了,而這個時候 StringBuffer 居然速度上根本一點都不占優勢。其實這是 JVM 的一個把戲,在 JVM 眼裡,這個
 String S1 = “This is only a” + “ simple” + “test”; 其實就是:
 String S1 = “This is only a simple test”; 所以當然不需要太多的時間了。但大家這裡要註意的是,如果你的字元串是來自另外的 String 對象的話,速度就沒那麼快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
這時候 JVM 會規規矩矩的按照原來的方式去做

在大部分情況下 StringBuffer > String
StringBuffer
Java.lang.StringBuffer線程安全的可變字元序列。一個類似於 String 的字元串緩衝區,但不能修改。雖然在任意時間點上它都包含某種特定的字元序列,但通過某些方法調用可以改變該序列的長度和內容。
可將字元串緩衝區安全地用於多個線程。可以在必要時對這些方法進行同步,因此任意特定實例上的所有操作就好像是以串列順序發生的,該順序與所涉及的每個線程進行的方法調用順序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數據。每個方法都能有效地將給定的數據轉換成字元串,然後將該字元串的字元追加或插入到字元串緩衝區中。append 方法始終將這些字元添加到緩衝區的末端;而 insert 方法則在指定的點添加字元。
例如,如果 z 引用一個當前內容是“start”的字元串緩衝區對象,則此方法調用 z.append("le") 會使字元串緩衝區包含“startle”,而 z.insert(4, "le") 將更改字元串緩衝區,使之包含“starlet”。
在大部分情況下 StringBuilder > StringBuffer
java.lang.StringBuilde
java.lang.StringBuilder一個可變的字元序列是5.0新增的。此類提供一個與 StringBuffer 相容的 API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字元串緩衝區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先採用該類,因為在大多數實現中,它比 StringBuffer 要快。兩者的方法基本相同。
  原文地址:http://blog.csdn.net/rmn190/article/details/1492013
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、場景 之前做的電商平臺,用戶在收到貨之後,大部分都不會主動的點擊確認收貨,導致給商家結款的時候,商家各種投訴,於是就根據需求,要做一個訂單在發貨之後的x天自動確認收貨。所謂的訂單自動確認收貨,就是在在特定的時間,執行一條update語句,改變訂單的狀態。 二、思路 最笨重的做法,通過linux後 ...
  • XML 使用DTD(document type definition)文檔類型來標記數據和定義數據,格式統一且跨平臺和語言,已成為業界公認的標準。 目前 XML 描述數據龍頭老大的地位漸漸受到 Json 威脅。經手項目中,模塊/系統之間交互數據方式有 XML 也有 Json,說不上孰好孰壞。 XML ...
  • 題目描述 以下皆為真實的故事。 洛谷2的團隊功能是其他任何oj和工具難以達到的。藉助洛谷強大的伺服器資源,任何學校都可以在洛谷上零成本的搭建oj並高效率的完成訓練計劃。 為什麼說是搭建oj呢?為什麼高效呢? 因為,你可以上傳私有題目,團隊外別人是無法看到的。我們還能幫你們評測! 你可以創建作業,給組 ...
  • 轉載連接:http://likfe.com/2017/05/10/android sys language/ 前言 獲取系統當前語言是一個比較常用的功能,在 Android 7.0 系統上舊函數獲取到的當前系統語言並不正確,或者說從 Android 7.0 起,Android 系統語言的規則變了。 ...
  • <span style="font-size:16px"></span><h3><span style="font-family:宋體,arial,sans-serif;font-size:14px;line-height:25px"><span class="link_title"><span s ...
  • 最近準備複習一遍所有的知識點,先從基礎開始做起,用幾分鐘寫個繼承和析構吧。 父類為A,子類為B,代碼如下: 這個時候在main函數里, 定義一個A的對象,A a;運行輸出結果為:構造A 析構A。 定義一個B的對象, B b;運行的輸出結果為:構造B 析構B。 定義一個A的指針,指向B。A *P = ...
  • 這是關於Python的第11篇文章,主要介紹下數據結構的3個小技巧。 排序: 使用sorted函數實現排序。 sorted函數按照長短、大小、英文字母的順序給每個列表的元素進行排序。這個函數經常在數據展示中使用,其中很重要的一點是sorted函數不會改變列表本身,相當於先複製列表然後做排序整理。 推 ...
  • 1 前言 本文的主要目的是為了讓Play Framework的初學者快速瞭解Scala語言,算是一篇Play Framework的入門前傳吧。使用PlayFramework可以極大的提高開發效率,但是需要註意,PlayJava入門很簡單,我之前帶過一個實習小姑娘,有一點編程經驗,但從來沒有接觸過Pl ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...