String、StringBuilder和StringBuffer的區別

目錄

      • 一. String:不可變的字符串
      • 二.StringBuilder:可變字符串
      • 三.StringBuffer:線程安全的可變字符串
      • 四.總結

在 Java 開發中,字符串處理是日常編碼中最頻繁的操作之一。String、StringBuilder 和 StringBuffer 這三個類雖然都用于操作字符串,但在性能、線程安全性和使用場景上存在顯著差異。

一. String:不可變的字符串

String 類是 Java 中最基礎的字符串類,其底層實現具有不可變性:

存儲結構:在 JDK 8 及之前,String 內部通過 private final char value[] 數組存儲字符;JDK 9 及以上改為 byte[] 數組(根據編碼自動選擇存儲方式,節省內存)。
不可變性:value 數組被 final 修飾,意味著一旦 String 對象創建,其內部的字符序列就無法被修改。任何看似 “修改” 的操作(如拼接、截取)都會創建新的 String 對象,原對象保持不變。

String str = "hello";
str += " world"; // 實際創建了新的 String 對象,原 "hello" 仍存在于內存中

這種設計的優勢是:

天然線程安全(多線程只能讀取,無法修改) 可作為 HashMap 等集合的鍵(哈希值不會變化) 字符串常量池復用,節省內存
但缺點也很明顯:頻繁修改會產生大量臨時對象,導致 GC 壓力增大,性能下降。

二.StringBuilder:可變字符串

存儲結構:內部通過 char[] value 數組存儲(無 final 修飾),支持動態擴容。

默認初始容量為 16; 當字符長度超過當前容量時,會創建一個新的數組(容量為原容量的 2 倍 + 2),并將原數據復制到新數組中。

可變性:所有修改操作(如 append()、insert()、delete())都直接操作底層數組,不會創建新對象(除非需要擴容)。

StringBuilder sb = new StringBuilder("hello");
sb.append(" world"); // 直接在原數組上修改,不創建新對象

由于省去了創建新對象的開銷,且沒有同步鎖的消耗,StringBuilder 成為單線程下字符串拼接的首選。

三.StringBuffer:線程安全的可變字符串

tringBuffer 是早期 Java 提供的可變字符串類,與 StringBuilder 最大的區別是線程安全性:

存儲結構:與 StringBuilder 基本一致,內部也是 char[] value 數組。
線程安全:通過在所有公共方法上添加 synchronized 關鍵字實現線程安全,確保多線程環境下的操作原子性。

public synchronized StringBuffer append(String str) {// 具體實現
}

這種設計保證了線程安全,但也帶來了同步鎖的性能開銷,因此在單線程環境下效率低于StringBuilder。

四.總結

在這里插入圖片描述

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

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

相關文章

Power Automate List Rows使用Fetchxml查詢的一個bug

看一段FetchXML, 這段查詢在XRMtoolbox中的fech test工具里執行完全ok<fetch version"1.0" mapping"logical" distinct"true" no-lock"false"> <entity name"new_projectchange"> <link-entity name"sy…

Letta(MemGPT)有狀態AI代理的開源框架

1. 項目概述Letta&#xff08;前身為 MemGPT&#xff09;是一個用于構建有狀態AI代理的開源框架&#xff0c;專注于提供長期記憶和高級推理能力。該項目是MemGPT研究論文的實現&#xff0c;引入了"LLM操作系統"的概念用于內存管理。核心特點有狀態代理&#xff1a;具…

除了ollama還有哪些模型部署方式?多樣化模型部署方式

在人工智能的浪潮中&#xff0c;模型部署是釋放其強大能力的關鍵一環。大家都知道ollama&#xff0c;它在模型部署領域有一定知名度&#xff0c;操作相對簡單&#xff0c;受到不少人的青睞。但其實&#xff0c;模型部署的世界豐富多樣&#xff0c;今天要給大家介紹一款工具&…

Linux系統學習之進階命令匯總

文章目錄一、系統信息1.1 查看系統信息&#xff1a;uname1.2 查看主機名&#xff1a;hostname1.3 查看cpu信息&#xff1a;1.4 當前已加載的內核模塊: lsmod1.5 查看磁盤空間使用情況: df1.6 管理磁盤分區: fdisk1.7 查看目錄或文件磁盤使用情況: du1.8 查看I/O使用情況: iosta…

算法面試(2)------休眠函數sleep_for和sleep_until

操作系統&#xff1a;ubuntu22.04 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 這兩個函數都定義在 頭文件中&#xff0c;屬于 std::this_thread 命名空間&#xff0c;用于讓當前線程暫停執行一段時間。函數功能sleep_for(rel_time)讓當前線程休眠一段相對時間&…

貪心算法應用:5G網絡切片問題詳解

Java中的貪心算法應用&#xff1a;5G網絡切片問題詳解 1. 5G網絡切片問題概述 5G網絡切片是將物理網絡劃分為多個虛擬網絡的技術&#xff0c;每個切片可以滿足不同業務需求&#xff08;如低延遲、高帶寬等&#xff09;。網絡切片資源分配問題可以抽象為一個典型的優化問題&…

Android WorkManager的概念和使用

1. WorkManager基礎與核心概念 1.1 WorkManager概述 WorkManager是Android Jetpack架構組件庫的核心成員&#xff0c;專為管理可靠的后臺任務而設計。它提供了一套統一的API&#xff0c;用于調度需保障執行的延遲型異步任務&#xff08;如數據同步、日志上傳&#xff09;&…

容器使用卷

1.創建一個卷并讓容器掛載該卷1.創建一個卷[roothost1 ~]# docker volume create test-vol test-vol2.列出本地 Docker 主機上的卷[roothost1 ~]# docker volume ls DRIVER VOLUME NAME local test-vol3.查看該卷的詳細信息[roothost1 ~]# docker volume inspect test-v…

高數基礎知識(下)②

文章目錄七、微分方程7.3 高階線性微分方程7.3.1 線性微分方程的解的結構7.3.2 常系數齊次線性微分方程7.3.3 常系數非齊次線性微分方程八、多元函數微分學8.1 偏導數8.2 全微分8.3 基本定理8.4 復合函數微分法8.5 隱函數微分法8.6 多元函數的極值8.6.1 無條件極值8.6.2 條件極…

從0°到180°,STM32玩轉MG996R舵機

1.MG996R舵機的性能參數參數數值產品型號MG995/MG996R產品重量55 g工作扭矩13 kgcm反應速度53-62 R/M使用溫度-30C ~ 55C死區設置4 微秒插頭類型JR、FUTABA 通用轉動角度180&#xff08;左90&#xff0c;右90&#xff09;舵機類型數碼舵機使用電壓3.0 - 7.2 V工作電流100 mA結構…

[frontend]mermaid code2image

hello everyone, welcome to my bolg, here i will introduce something interesting, and if you are interested it, please just let me know. follow me and send me a message are both avaiable. what is mermaid? Mermaid 是一個工具&#xff0c;它能讓你用簡單的文字代…

Jakarta EE 在 IntelliJ IDEA 中開發簡單留言板應用的實驗指導(附完整代碼)

Jakarta EE 在 IntelliJ IDEA 中開發簡單留言板應用的實驗指導(附完整代碼) 摘要:實驗基于Jakarta EE 9+(兼容Tomcat 10+)、Maven作為構建工具,并在IntelliJ IDEA 2023.2(Community版免費)中進行。項目使用Maven Archetype WebApp模板生成基礎結構,然后升級到J…

JavaScript經典面試題一(JavaScript基礎)

目錄 一、JavaScript中的變量提升 1. 機制 2. 示例 3. 注意事項 4. 總結 二、var、let和const的區別。 1. 作用域&#xff08;Scope&#xff09; 2. 變量提升&#xff08;Hoisting&#xff09; 3. 重新賦值和重新聲明 4. 示例 示例1&#xff1a;作用域和塊級行為 示…

數據庫造神計劃第七天---增刪改查(CRUD)(3)

&#x1f525;個人主頁&#xff1a;尋星探路 &#x1f3ac;作者簡介&#xff1a;Java研發方向學習者 &#x1f4d6;個人專欄&#xff1a;《從青銅到王者&#xff0c;就差這講數據結構&#xff01;&#xff01;&#xff01;》、 《JAVA&#xff08;SE&#xff09;----如此簡單&a…

AWS SQS 可觀測性最佳實踐

AWS SQS AWS SQS&#xff08;Amazon Simple Queue Service&#xff09;是一種完全托管的消息隊列服務&#xff0c;用于在分布式系統中解耦和緩沖消息。它支持高可用性、可擴展性和安全性&#xff0c;能夠處理大量消息&#xff0c;確保消息的可靠傳輸和順序性。開發者可以輕松集…

AI推理范式:從CoT到ReAct再到ToT的進化之路

在人工智能領域&#xff0c;如何讓模型像人類一樣進行復雜推理和問題解決&#xff0c;一直是核心挑戰。近年來&#xff0c;思維鏈&#xff08;Chain-of-Thought, CoT&#xff09;、推理與行動&#xff08;ReAct&#xff09; 和 思維樹&#xff08;Tree-of-Thoughts, ToT&#x…

2025時序數據庫選型:深入解析IoTDB從主從架構基因到AI賦能的創新之路

原創經驗總結,拒絕空談,用數據和實戰說話 時序數據時代的"四重考驗" 在智慧工廠、新能源車、金融市場等場景中,每秒百萬級的數據點如潮水般涌來。這些時序數據背后隱藏著四大核心挑戰:極高的寫入并發、強時間關聯性查詢、海量數據生命周期管理,以及亂序與高基…

深入淺出LVS負載均衡群集:原理、分類與NAT模式實戰部署

深入淺出LVS負載均衡群集&#xff1a;原理、分類與NAT模式實戰部署 文章目錄深入淺出LVS負載均衡群集&#xff1a;原理、分類與NAT模式實戰部署一、企業群集&#xff1a;從單臺服務器到分布式架構的必然選擇1. 什么是群集&#xff1f;2. 為什么需要群集&#xff1f;二、企業群集…

Flash Table實測:JAI賦能低代碼開發,重塑企業級應用構建范式

目錄&#x1f50d; 引言1.1 什么是Flash Table1.2 低代碼平臺的進化與FlashTable的革新?FlashTable背景&#xff1a;為什么需要新一代低代碼平臺&#xff1f;2.1 傳統開發的痛點2.2 低代碼平臺的局限2.3 FlashTable的差異化定位&#x1f4bb; FlashTable安裝&#xff1a;Docke…

SonarQube代碼質量管理平臺本地化搭建和使用

SonarQube 是一個開源的代碼質量管理平臺&#xff0c;主要用于持續檢查代碼質量&#xff0c;支持多種編程語言。 本文章記錄了在windows環境中&#xff0c;搭建和使用SonarQube的完整過程。 ①SonarQube平臺搭建 SonarQube最新社區版本下載地址&#xff1a; https://www.son…