Java字符串的處理方式及作用介紹
StringBuilder、StringBuffer 和 String 是 Java 中處理字符串的三種主要方式,每種有不同的特點(diǎn)和適用場(chǎng)景。讓我們逐個(gè)詳細(xì)了解它們的區(qū)別、作用及使用方法。
1. String 特性:
String是不可變類(lèi)(immutable),一旦創(chuàng)建就不能更改。如果對(duì)字符串進(jìn)行修改操作,例如拼接、截取、替換等操作,都會(huì)產(chǎn)生新的字符串對(duì)象,并且舊的對(duì)象仍然保留在內(nèi)存中,直到被垃圾回收。- 作用:
String通常用于存儲(chǔ)和操作不經(jīng)常變化的字符串?dāng)?shù)據(jù),如靜態(tài)文本、標(biāo)簽、用戶(hù)輸入等。 - 使用場(chǎng)景:
- 當(dāng)字符串內(nèi)容不頻繁變化時(shí)適合使用
String,例如拼接少量字符串。 - 因?yàn)椴豢勺兲匦裕?code>String 對(duì)多線程是天然安全的,不會(huì)受到并發(fā)修改的影響。
- 當(dāng)字符串內(nèi)容不頻繁變化時(shí)適合使用
示例代碼:
String str = "Hello"; str += " World"; // 會(huì)創(chuàng)建新的字符串對(duì)象 "Hello World" System.out.println(str); // 輸出 "Hello World"
- Java中的String類(lèi)不可以被繼承,因?yàn)镾tring類(lèi)被聲明為
final,禁止其他類(lèi)繼承它。- String類(lèi)型的“+”方法的底層實(shí)現(xiàn):編譯器將
+轉(zhuǎn)換為StringBuilder的append()鏈?zhǔn)秸{(diào)用,最后調(diào)用toString()生成新String對(duì)象。
2. StringBuffer
- 特性:
StringBuffer是可變類(lèi)(mutable),它在修改時(shí)不會(huì)創(chuàng)建新的對(duì)象。適合需要頻繁修改字符串的場(chǎng)景。StringBuffer是線程安全的,每個(gè)方法都加了synchronized關(guān)鍵字,保證在多線程環(huán)境下的安全性。- 作用:在多線程環(huán)境中需要頻繁操作字符串時(shí),
StringBuffer是更合適的選擇。 - 使用場(chǎng)景:
- 當(dāng)多個(gè)線程可能會(huì)同時(shí)操作同一字符串時(shí)使用
StringBuffer。 - 在需要大量拼接字符串且要求線程安全的場(chǎng)景下,如在
append、insert等操作中使用。
- 當(dāng)多個(gè)線程可能會(huì)同時(shí)操作同一字符串時(shí)使用
示例代碼:
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");
System.out.println(sb.toString()); // 輸出 "Hello World"3. StringBuilder
- 特性:
StringBuilder也是可變類(lèi),與StringBuffer的用法基本相同,適合頻繁修改字符串內(nèi)容的場(chǎng)景。但與StringBuffer不同的是,StringBuilder不是線程安全的,因此在單線程環(huán)境中,StringBuilder的性能更高。 - 作用:在單線程環(huán)境下,
StringBuilder可以替代StringBuffer,提供更高的性能。 - 使用場(chǎng)景:
- 單線程環(huán)境下,頻繁修改字符串的場(chǎng)合使用
StringBuilder。 - 推薦在需要拼接大量字符串且不涉及多線程的場(chǎng)景中使用
StringBuilder。
- 單線程環(huán)境下,頻繁修改字符串的場(chǎng)合使用
示例代碼:
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
System.out.println(sb.toString()); // 輸出 "Hello World"總結(jié)對(duì)比
| 特性 | String | StringBuffer | StringBuilder |
|---|---|---|---|
| 是否可變 | 不可變 | 可變 | 可變 |
| 線程安全 | 是 | 是 | 否 |
| 性能 | 最低 | 中等 | 最高(單線程情況下) |
| 使用場(chǎng)景 | 少量字符串修改 | 多線程環(huán)境中大量字符串修改 | 單線程環(huán)境中大量字符串修改 |
StringBuilder、StringBuffer 和 String 之間的轉(zhuǎn)換方法
(1)String 轉(zhuǎn) StringBuilder / StringBuffer
使用 構(gòu)造方法 直接轉(zhuǎn)換:
// String -> StringBuilder String str = "Hello"; StringBuilder stringBuilder = new StringBuilder(str); // String -> StringBuffer StringBuffer stringBuffer = new StringBuffer(str);
(2)StringBuilder / StringBuffer 轉(zhuǎn) String
使用 toString() 方法轉(zhuǎn)換為
String:
// StringBuilder -> String
StringBuilder stringBuilder = new StringBuilder("Hello");
String strFromBuilder = stringBuilder.toString();
// StringBuffer -> String
StringBuffer stringBuffer = new StringBuffer("Hello");
String strFromBuffer = stringBuffer.toString();(3)StringBuilder 和 StringBuffer 之間轉(zhuǎn)換
由于
StringBuilder和StringBuffer都有類(lèi)似的構(gòu)造方法,可以直接通過(guò)構(gòu)造方法進(jìn)行轉(zhuǎn)換。
// StringBuilder -> StringBuffer
StringBuilder stringBuilder = new StringBuilder("Hello");
StringBuffer stringBuffer = new StringBuffer(stringBuilder);
// StringBuffer -> StringBuilder
StringBuffer stringBuffer2 = new StringBuffer("World");
StringBuilder stringBuilder2 = new StringBuilder(stringBuffer2);1. String 的常用方法
由于 String 是不可變的,每次修改都會(huì)返回一個(gè)新對(duì)象。以下是常用方法:
1.1 charAt(int index)
獲取指定位置的字符。
String str = "Hello"; char ch = str.charAt(1); // 'e'
1.2 concat(String str)
拼接字符串,返回一個(gè)新的字符串。
String str1 = "Hello";
String str2 = str1.concat(" World"); // "Hello World"1.3 substring(int beginIndex, int endIndex)
截取字符串的子串,返回新字符串。
String str = "Hello World"; String subStr = str.substring(0, 5); // "Hello"
1.4 toUpperCase() / toLowerCase()
轉(zhuǎn)換為大寫(xiě)或小寫(xiě),返回新字符串。
String str = "Hello World"; String upper = str.toUpperCase(); // "HELLO WORLD"
1.5 replace(char oldChar, char newChar)
替換字符,返回新的字符串。replace() 方法有兩個(gè)重載版本:
(1)replace(char oldChar, char newChar)
用于替換單個(gè)字符,參數(shù)是 char 類(lèi)型,需要用單引號(hào)。
String str = "Hello World";
String noSpaceStr = str.replace(' ', ''); // 錯(cuò)誤!第二個(gè)參數(shù)不能為空字符注意:這里有一個(gè)問(wèn)題,newChar 不能為空字符(''),因?yàn)?Java 中字符不能為空。所以這種方法不適用于去除空格。
(2)replace(CharSequence target, CharSequence replacement)
用于替換字符串,參數(shù)是 CharSequence 類(lèi)型(String 是其子類(lèi)),需要用雙引號(hào)。
String str = "Hello World";
String noSpaceStr = str.replace(" ", ""); // 正確!用空字符串替換空格字符串為什么用雙引號(hào)?
在去除空格時(shí),我們通常希望將空格字符串(" ")替換為空字符串(""),而不是替換單個(gè)字符。因此,使用雙引號(hào)的 replace(" ", "") 是正確的做法。
1.6 split(String regex)
根據(jù)正則表達(dá)式分割字符串,返回字符串?dāng)?shù)組。
String str = "Hello,World,Java";
String[] parts = str.split(","); // ["Hello", "World", "Java"]1.7 equals(Object obj)
比較字符串內(nèi)容是否相等。
String str1 = "Hello"; String str2 = "Hello"; boolean isEqual = str1.equals(str2); // true
1.8 isEmpty()
判斷字符串是否為空。
String str = ""; boolean isEmpty = str.isEmpty(); // true
1.9 toCharArray()
將字符串轉(zhuǎn)換為字符數(shù)組。
String str = "Hello"; char[] charArray = str.toCharArray(); // ['H', 'e', 'l', 'l', 'o']
1.10 String.valueOf(char[] data)
String 類(lèi)的靜態(tài)方法 valueOf 也可以將 char 數(shù)組轉(zhuǎn)換為 String。
char[] charArray = {'H', 'e', 'l', 'l', 'o'};
String str = String.valueOf(charArray); // "Hello"2. StringBuffer 的常用方法
StringBuffer 是可變的,支持在原對(duì)象上修改字符串。以下是一些常見(jiàn)的方法:
2.1 append(String str)(有重載版本添加其他數(shù)據(jù)類(lèi)型,比如char)
在末尾添加字符串,修改原對(duì)象。
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World"); // 修改后變?yōu)?"Hello World"2.2 insert(int offset, String str)
在指定位置插入字符串。
StringBuffer sb = new StringBuffer("Hello World");
sb.insert(5, ","); // 修改后變?yōu)?"Hello, World"2.3 replace(int start, int end, String str)
替換指定范圍內(nèi)的內(nèi)容。
StringBuffer sb = new StringBuffer("Hello World");
sb.replace(6, 11, "Java"); // 修改后變?yōu)?"Hello Java"2.4 delete(int start, int end)
刪除指定范圍內(nèi)的字符。
StringBuffer sb = new StringBuffer("Hello World");
sb.delete(5, 11); // 修改后變?yōu)?"Hello"2.5 reverse()
將字符串內(nèi)容反轉(zhuǎn)。
StringBuffer sb = new StringBuffer("Hello");
sb.reverse(); // 修改后變?yōu)?"olleH"2.6 deleteCharAt(int index)
刪除指定位置的字符
StringBuffer sbf = new StringBuffer("Java?");
sbf.deleteCharAt(sbf.length() - 1); // 刪除最后一個(gè)字符 '?'
System.out.println(sbf); // 輸出: Java3. StringBuilder 的常用方法
StringBuilder 與 StringBuffer 方法相同,但不加鎖,適合單線程場(chǎng)景。以下列舉常用方法:
3.1 append(String str) (有重載版本添加其他數(shù)據(jù)類(lèi)型,比如char)
在末尾添加字符串。
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 修改后變?yōu)?"Hello World"3.2 insert(int offset, String str)
在指定位置插入字符串。
StringBuilder sb = new StringBuilder("Hello World");
sb.insert(5, ","); // 修改后變?yōu)?"Hello, World"3.3 replace(int start, int end, String str)
替換指定范圍的內(nèi)容。
StringBuilder sb = new StringBuilder("Hello World");
sb.replace(6, 11, "Java"); // 修改后變?yōu)?"Hello Java"3.4 delete(int start, int end)
刪除指定范圍的字符。
StringBuilder sb = new StringBuilder("Hello World");
sb.delete(5, 11); // 修改后變?yōu)?"Hello"3.5 reverse()
將字符串內(nèi)容反轉(zhuǎn)。
StringBuilder sb = new StringBuilder("Hello");
sb.reverse(); // 修改后變?yōu)?"olleH"3.6 deleteCharAt(int index)
刪除指定位置的字符
StringBuilder sb = new StringBuilder("Hello!");
sb.deleteCharAt(5); // 刪除索引5位置的字符 '!'
System.out.println(sb); // 輸出: Hello到此這篇關(guān)于Java字符串的處理的文章就介紹到這了,更多相關(guān)Java字符串處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java response響應(yīng)體和文件下載實(shí)現(xiàn)原理
這篇文章主要介紹了Java response響應(yīng)體和文件下載實(shí)現(xiàn)原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
java 各種數(shù)據(jù)類(lèi)型的互相轉(zhuǎn)換實(shí)例代碼
這篇文章主要介紹了java 各種數(shù)據(jù)類(lèi)型的互相轉(zhuǎn)換實(shí)例代碼,需要的朋友可以參考下2020-10-10
java web開(kāi)發(fā)之servlet圖形驗(yàn)證碼功能的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了java web開(kāi)發(fā)之servlet中圖形驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
Spring Security 中的 AuthenticationManager配置及使用
本文我們將探討 AuthenticationManager 在 Spring Security 中的作用,并指導(dǎo)您完成其配置和實(shí)際應(yīng)用,感興趣的朋友跟隨小編一起看看吧2024-11-11
springboot整合curator實(shí)現(xiàn)分布式鎖過(guò)程
這篇文章主要介紹了springboot整合curator實(shí)現(xiàn)分布式鎖過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
詳談Java中的事件監(jiān)聽(tīng)機(jī)制
下面小編就為大家?guī)?lái)一篇詳談Java中的事件監(jiān)聽(tīng)機(jī)制。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06

