Java字符處理之char、String、StringBuilder和StringBuffer詳解
好的,我們來深入解析 Java 中的 char、String、StringBuilder 和 StringBuffer。理解它們之間的區(qū)別對于編寫高效、正確的 Java 代碼至關(guān)重要。
1.char:基本數(shù)據(jù)類型
- 本質(zhì):
char是 Java 中的基本數(shù)據(jù)類型(Primitive Type),表示一個(gè) 16 位無符號 Unicode 字符。它占用 2 個(gè)字節(jié)(16 位)內(nèi)存空間。 - 值范圍:最小值為
\u0000(即 0),最大值為\uffff(即 65, 535)。可以表示世界上大多數(shù)字符。 - 特點(diǎn):
- 是基本類型,不是對象,沒有方法。
- 字面值用單引號
'表示,例如:char grade = 'A'; - 可以直接參與算術(shù)運(yùn)算(提升為
int)。 - 存儲(chǔ)在棧內(nèi)存(如果作為局部變量)或?qū)ο髢?nèi)部。
- 用途:主要用于表示單個(gè)字符。
2.String:不可變的字符序列
- 本質(zhì):
String是一個(gè) 類(Class),用于表示不可變的字符序列。它內(nèi)部封裝了一個(gè)char[]數(shù)組來存儲(chǔ)字符。 - 核心特性 - 不可變性 (Immutability):
- 一旦
String對象被創(chuàng)建,其包含的字符序列 就不能被更改。任何看似修改String的操作(如concat,substring,toUpperCase,replace等),實(shí)際上都是 創(chuàng)建并返回一個(gè)全新的String對象。 - 優(yōu)點(diǎn):
- 線程安全:由于不可變,多個(gè)線程可以安全地共享同一個(gè)
String對象,無需同步。 - 緩存與優(yōu)化:Java 使用“字符串常量池”(String Pool)來緩存字符串字面量,減少重復(fù)創(chuàng)建的開銷。例如:
String s1 = "hello"; // 可能從池中獲取 String s2 = "hello"; // 指向池中同一個(gè)對象 String s3 = new String("hello"); // 強(qiáng)制在堆上創(chuàng)建新對象 - 安全性:常用于敏感信息(如密碼)的傳遞,因?yàn)椴豢勺儯苊饬藘?nèi)容被意外修改的風(fēng)險(xiǎn)。
- HashCode 穩(wěn)定性:
String的hashCode()值在對象創(chuàng)建時(shí)計(jì)算一次并緩存,后續(xù)調(diào)用直接返回緩存值,效率高且穩(wěn)定,非常適合作為哈希表的鍵(如HashMap)。
- 線程安全:由于不可變,多個(gè)線程可以安全地共享同一個(gè)
- 缺點(diǎn):
- 頻繁修改效率低:每次“修改”都會(huì)產(chǎn)生新的對象,如果在一個(gè)循環(huán)中反復(fù)拼接字符串,會(huì)產(chǎn)生大量中間臨時(shí)對象,增加 GC 壓力。
- 一旦
- 創(chuàng)建方式:
- 字面量:
String s = "abc";(優(yōu)先使用常量池) - 構(gòu)造函數(shù):
String s = new String("abc");(在堆上新建對象) - 字符數(shù)組:
char[] data = {'a', 'b', 'c'}; String str = new String(data); +運(yùn)算符拼接(底層可能編譯優(yōu)化為StringBuilder)。
- 字面量:
- 常用方法:
length(),charAt(int index),concat(String str),equals(Object anObject),indexOf(String str),substring(int beginIndex),toLowerCase(),toUpperCase(),trim(),split(String regex)等。
3.StringBuilder:可變的字符序列 (非線程安全)
- 本質(zhì):
StringBuilder也是一個(gè)類,用于表示 可變的字符序列。它也封裝了一個(gè)char[]數(shù)組(稱為緩沖區(qū))。 - 核心特性 - 可變性 (Mutability):
- 對象內(nèi)部的字符序列 可以被修改。修改操作(如
append,insert,delete,replace)直接在原有緩沖區(qū)上進(jìn)行,不會(huì)創(chuàng)建新對象(除非緩沖區(qū)容量不足需要擴(kuò)容)。
- 對象內(nèi)部的字符序列 可以被修改。修改操作(如
- 特點(diǎn):
- 高效修改:非常適合在循環(huán)中或需要多次修改字符串內(nèi)容的場景(如日志拼接、動(dòng)態(tài) SQL 生成),避免了
String拼接帶來的性能問題。 - 非線程安全:
StringBuilder的方法 沒有 進(jìn)行同步(synchronized)處理。如果多個(gè)線程同時(shí)修改同一個(gè)StringBuilder實(shí)例,可能會(huì)導(dǎo)致數(shù)據(jù)不一致。因此,它適用于 單線程環(huán)境。 - 創(chuàng)建:通常通過構(gòu)造函數(shù)
new StringBuilder()或new StringBuilder(String str)創(chuàng)建。 - 最終字符串獲取:通過
toString()方法獲取最終的不可變String對象。
- 高效修改:非常適合在循環(huán)中或需要多次修改字符串內(nèi)容的場景(如日志拼接、動(dòng)態(tài) SQL 生成),避免了
- 常用方法:
append(...)(多種重載,支持基本類型、對象等),insert(int offset, ...),delete(int start, int end),replace(int start, int end, String str),reverse(),setCharAt(int index, char ch),toString()。
4.StringBuffer:可變的字符序列 (線程安全)
- 本質(zhì):
StringBuffer是StringBuilder的 線程安全版本。它也用于表示可變的字符序列。 - 核心特性 - 可變性與線程安全:
- 對象內(nèi)部的字符序列可以被修改。
- 所有對
StringBuffer進(jìn)行修改的公共方法(如append,insert,delete,replace)都使用了synchronized關(guān)鍵字進(jìn)行同步,保證了在 多線程環(huán)境 下的操作安全。
- 特點(diǎn):
- 線程安全:可以在多線程環(huán)境下安全地修改同一個(gè)
StringBuffer實(shí)例。 - 性能開銷:由于同步鎖的存在,
StringBuffer的操作性能通常 低于StringBuilder。在單線程環(huán)境中使用StringBuffer會(huì)帶來不必要的性能損失。 - 創(chuàng)建與獲取:用法與
StringBuilder類似,通過構(gòu)造函數(shù)創(chuàng)建,通過toString()獲取最終String。
- 線程安全:可以在多線程環(huán)境下安全地修改同一個(gè)
- 歷史:
StringBuffer是 JDK 1.0 就存在的類。StringBuilder是在 JDK 1.5 引入的,作為StringBuffer的非線程安全替代品,旨在提高單線程下的性能。
總結(jié)對比表
| 特性 | char | String | StringBuilder | StringBuffer |
|---|---|---|---|---|
| 類型 | 基本數(shù)據(jù)類型 | 類 (不可變) | 類 (可變) | 類 (可變) |
| 可變性 | 值可變 | 不可變 | 可變 | 可變 |
| 線程安全 | 不適用 (基本類型) | 是 (因不可變) | 否 | 是 (同步方法) |
| 性能 (修改) | 高 | 低 (創(chuàng)建新對象) | 高 (單線程) | 中低 (因同步) |
| 適用場景 | 單個(gè)字符 | 常量字符串、鍵值、方法參數(shù)傳遞等 | 單線程下頻繁修改字符串 | 多線程下頻繁修改字符串 |
| 創(chuàng)建方式 | 字面量 'A' | 字面量 "abc" / new String(...) | new StringBuilder() | new StringBuffer() |
| 最終字符串 | - | 自身 | toString() | toString() |
選用建議
- 單個(gè)字符:使用
char。 - 不常修改的字符串:優(yōu)先使用
String(利用常量池、線程安全、HashCode 穩(wěn)定等優(yōu)點(diǎn))。 - 單線程下頻繁修改字符串:強(qiáng)烈推薦使用
StringBuilder(性能最優(yōu))。 - 多線程下頻繁修改字符串:使用
StringBuffer(保證線程安全)。 - 簡單拼接:少量固定字符串拼接可用
String的+(編譯器可能會(huì)優(yōu)化成StringBuilder)。大量或循環(huán)拼接務(wù)必使用StringBuilder/StringBuffer。
理解它們的設(shè)計(jì)意圖和優(yōu)缺點(diǎn),有助于你在不同場景下做出最合適的選擇,寫出更高效、更健壯的 Java 代碼。
總結(jié)
到此這篇關(guān)于Java字符處理之char、String、StringBuilder和StringBuffer的文章就介紹到這了,更多相關(guān)Java字符處理char、String與StringBuilder內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中的char、String、StringBuilder與StringBuffer全方面解析
- Java字符串四大類之String、StringBuffer、StringBuilder、StringJoiner詳解
- Java中String、StringBuffer和StringBuilder底層實(shí)現(xiàn)深入剖析
- Java中String、StringBuffer和StringBuilder的區(qū)別
- Java中StringBuilder與StringBuffer的區(qū)別
- Java中StringBuilder與StringBuffer使用及源碼解讀
- 淺析Java中StringBuffer和StringBuilder的使用
- 詳解Java中String,StringBuffer和StringBuilder的使用
- Java中String和StringBuffer及StringBuilder?有什么區(qū)別
- Java 中 String、StringBuffer、StringBuilder 的區(qū)別
相關(guān)文章
關(guān)于java中基本數(shù)據(jù)類型的數(shù)值范圍
這篇文章主要介紹了關(guān)于java中基本數(shù)據(jù)類型的數(shù)值范圍,基本類型,或者叫做內(nèi)置類型,是JAVA中不同于類的特殊類型,它們是我們編程中使用最頻繁的類型,需要的朋友可以參考下2023-07-07
Spring boot中使用Spring-data-jpa方便快捷的訪問數(shù)據(jù)庫(推薦)
Spring Data JPA 是 Spring 基于 ORM 框架、JPA 規(guī)范的基礎(chǔ)上封裝的一套JPA應(yīng)用框架,可使開發(fā)者用極簡的代碼即可實(shí)現(xiàn)對數(shù)據(jù)的訪問和操作。這篇文章主要介紹了Spring-boot中使用Spring-data-jpa方便快捷的訪問數(shù)據(jù)庫,需要的朋友可以參考下2018-05-05
關(guān)于重寫equals()方法和hashCode()方法及其簡單的應(yīng)用
這篇文章主要介紹了關(guān)于重寫equals()方法和hashCode()方法及其簡單的應(yīng)用,網(wǎng)上的知識有些可能是錯(cuò)誤的,關(guān)于?equals()?方法的理解,大家討論不一樣,需要的朋友可以參考下2023-04-04
maven項(xiàng)目pom.xml中parent標(biāo)簽的使用小結(jié)
使用maven是為了更好的幫項(xiàng)目管理包依賴,maven的核心就是pom.xml,當(dāng)我們需要引入一個(gè)jar包時(shí),在pom文件中加上就可以從倉庫中依賴到相應(yīng)的jar包,本文就來介紹一下maven項(xiàng)目pom.xml中parent標(biāo)簽的使用小結(jié),感興趣的可以了解一下2023-12-12
java Long類型轉(zhuǎn)為String類型的兩種方式及區(qū)別說明
這篇文章主要介紹了java Long類型轉(zhuǎn)為String類型的兩種方式及區(qū)別說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java 單向隊(duì)列及環(huán)形隊(duì)列的實(shí)現(xiàn)原理
本文主要介紹了Java 單向隊(duì)列及環(huán)形隊(duì)列的實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
SpringBoot服務(wù)監(jiān)控機(jī)制原理解析(面試官常問)
這篇文章主要介紹了SpringBoot服務(wù)監(jiān)控機(jī)制原理解析(面試官常問),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
LinkList的底層數(shù)據(jù)結(jié)構(gòu)及優(yōu)缺點(diǎn)詳解
鏈表由節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)包含數(shù)據(jù)域和指針域,節(jié)點(diǎn)在內(nèi)存中非連續(xù)分布,通過指針鏈接形成邏輯上的線性關(guān)系,鏈表支持動(dòng)態(tài)大小、高效插入/刪除,但隨機(jī)訪問效率低,且需要手動(dòng)管理指針2025-11-11
Spring Boot Excel文件導(dǎo)出下載實(shí)現(xiàn)代碼
這篇文章帶領(lǐng)我們直接實(shí)現(xiàn)Excel文件的直接導(dǎo)出下載,后續(xù)開發(fā)不需要開發(fā)很多代碼,直接繼承已經(jīng)寫好的代碼,增加一個(gè)Xml配置就可以直接導(dǎo)出。具體實(shí)現(xiàn)代碼大家跟隨小編一起通過本文學(xué)習(xí)吧2018-11-11

