String,StringBuffer,StringBuilder區別

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 要快。兩者的方法基本相同。

?

轉自rmn190,感謝分享。

轉載于:https://www.cnblogs.com/wdnnccey/p/5854335.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457959.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457959.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457959.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

oracle數據庫更新語句_20_手把手教你學Python之操作數據庫

數據庫是數據的倉庫,將大量數據按照一定的方式組織并存儲起來,方便進行管理和維護,例如快速檢索和統計等。數據庫的主要特點:以一定的方式組織、存儲數據;能為多個用戶共享;與程序彼此獨立。……數據庫管理…

第十周學習進度

第十周 所花時間(包括上課) 10小時 代碼量(行) 0行 博客量(篇) 4篇 了解到的知識點 對各組進行評價;思考并回復各組 轉載于:https://www.cnblogs.com/qwer111/p/5470819.html

嵌入式常見筆試題總結(3)

1:設float a2, b4, c3;,以下C語言表達式與代數式 (ab)c計算結果不一致的是 A.(ab)*c/2 B.(1/2)*(ab)*c C.(ab)*c*1/2 D.c/2*(ab) 參考答案:B,因為a,b,c三個變量都是浮點數,所以在B答案中其結果是0,因為…

查詢Oracle正在執行的sql語句

--查詢Oracle正在執行的sql語句及執行該語句的用戶 [sql] view plaincopy SELECT b.sid oracleID, b.username 登錄Oracle用戶名, b.serial#, spid 操作系統ID, paddr, sql_text 正在執行的SQL, b.machine 計算機名 FROM v$p…

WinForm 清空界面控件值的小技巧

WinForm 清空界面控件值的小技巧 原文:WinForm 清空界面控件值的小技巧在WinForm里面有時候需要清空自己輸入內容或是選擇的選項,以便重新操作流程,那么一般你是怎么清空界面各個控件值的呢?如果窗體里面控件,尤其是TextBox控件比…

int 取值范圍_一定范圍內的隨機數

老司機的新問題,取得[min, max]范圍的隨機數。C版本的rand函數很不容易用對,直接用rand() % (max - min 1) min,這個公式不對。這個公式與取最低位的算法相同,而隨機數的最低幾位不一定等概率。Donald Knuth博士教導我們正確的用…

virsh的使用

2019獨角獸企業重金招聘Python工程師標準>>> ###這里最先要完成的是對網卡的配置(os ubuntu14.04) 目的是實現vm上是以橋接的方式聯網 修改/etc/network/interfaces # interfaces(5) file used by ifup(8) and ifdown(8) auto lo iface lo inet loopback #auto eth0…

嵌入式常見筆試題總結(4)

1:用C語言實現大小端的測試 Int CheckCpu() { union { int a; char b; }c; c.a1; if(c.b1) printf(“小端”); else printf(“大端”); } 2:volatile的作用有哪些? Volatile第一變量相當于告訴編…

《java入門第一季》之類String類小案例

String類有許多獲取方法,API文檔里面可查看。針對獲取方法,給出小案例。 /** 需求:遍歷獲取字符串中的每一個字符* 分析: 用到兩個方法:char charAt(int index) 表示獲取字符串指定索引的字符int length() …

同字母異序詞 python_49. 字母異位次分組(Python)

題目 給定一個字符串數組,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字符串。 說明 所有輸入均為小寫字母。 不考慮答案輸出的順序。 示例 輸入: ["eat", "tea", "tan", "ate", "nat&quo…

嵌入式常見筆試題總結(5)

1、 如何在C中初始化一個字符數組。這個問題看似很簡單,但是我們要將最簡單的問題用最嚴謹的態度來對待。關鍵的地方:初始化、字符型、數組。最簡單的方法是char array[];。這個問題看似解決了,但是在初始化上好像還欠缺點什么,個…

SQL Server - 高可用與災難恢復(HADR)技術 -- AlwaysOn可用性組(理論篇)

因為篇幅原因,AlwaysOn可用性組被拆成了兩部分:理論部分和實戰部分。而實戰部分又被拆成了準備工作和AlwaysOn可用性組搭建。 三篇文章各自的鏈接: SQL Server ->> 高可用與災難恢復(HADR)技術 -- AlwaysOn&…

嵌入式常見筆試題總結(6)

一、常識理論題 1、 簡述嵌入式操作系統有哪些,你用過哪幾種,簡述其特點、優勢及劣勢?(5分) 2、 請描述控制及提高嵌入式軟件質量有哪些辦法,在開發過程中怎么才能保證嵌入式軟件的可靠性?(5分)…

python 3.6.5編譯安裝_Linux系統安裝Python3.6.5

Linux系統安裝Python3.6.5 1、下載Python3.6.5 wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz 如果報command not found則執行:yum -y install wget命令后再進行下載 也可下載好安裝包進行手動上傳 2、安裝Python3.6可能使用的依賴 yum install o…

從傳統運維到云運維演進歷程之軟件定義存儲(一)

運維是企業業務系統從規劃、設計、實施、交付到運維的最后一個步驟,也是重要的步驟。運維從橫向、縱向分可以分為多個維度和層次,本文試圖拋開這紛繁復雜的概念,講述一個傳統的企業級運維人員轉型到云運維人員,尤其是軟件定義存儲…

Abp Uow 設計

初始化入口 在AbpKernelModule類中&#xff0c;通過UnitOfWorkRegistrar.Initialize(IocManager) 方法去初始化 1 /// <summary>2 /// This class is used to register interceptor for needed classes for Unit Of Work mechanism.3 /// </summary>4 …

python3.8 實現鼠標自動移動_“新生報到”!【移動機器人 HD-1500】負載1500kg,實現了重型貨物運輸的自動化...

2020年第三季度歐姆龍自動化&#xff08;中國&#xff09;有限公司新品【移動機器人 HD-1500】即日起在中國市場首次對外發布&#xff0c;實現了重型貨物運輸的自動化。這款最新的自動化移動機器人重型載荷能力為1500 kg&#xff01;更高的載荷能力可以令客戶實現以前無法實現的…

Linux 關閉服務后 鼠標 鍵盤用不了

大部分情況下我們做實驗都是使用虛擬機&#xff0c;但是個人比較本實在太老了&#xff0c;性能有限&#xff0c;所以虛擬機里面的系統啟動神慢&#xff0c;怎么辦&#xff1f;把系統中自己用不到的服務全部關閉掉唄&#xff0c;如下for i in chkconfig --list | awk {print $1}…

對session的理解

java Servlet API引入session 機制來跟蹤客戶的狀態&#xff0c;session指的是在一段時間內&#xff0c;單個客戶和web服務器之間一連串的交互過程&#xff0c;在一個session中&#xff0c;一個客戶可能會多次請求同一個網頁&#xff0c;也可能請求多個不同服務器資源&#xff…

android 監聽本機網絡請求_fiddler如何抓取https請求實現fiddler手機抓包-證書安裝失敗100%解決...

一、HTTP協議和HTTPS協議。(1) HTTPS協議HTTP協議SSL協議&#xff0c;默認端口&#xff1a;443(2) HTTP協議&#xff08;HyperText Transfer Protocol&#xff09;&#xff1a;超文本傳輸協議。默認端口&#xff1a;80&#xff0c;其中包含請求和響應兩部分&#xff0c;其中請求…