Java字符串的處理方式及作用介紹
StringBuilder
、StringBuffer
和 String
是 Java 中處理字符串的三種主要方式,每種有不同的特點和適用場景。讓我們逐個詳細了解它們的區(qū)別、作用及使用方法。
1. String
特性:
String
是不可變類(immutable),一旦創(chuàng)建就不能更改。如果對字符串進行修改操作,例如拼接、截取、替換等操作,都會產(chǎn)生新的字符串對象,并且舊的對象仍然保留在內(nèi)存中,直到被垃圾回收。- 作用:
String
通常用于存儲和操作不經(jīng)常變化的字符串數(shù)據(jù),如靜態(tài)文本、標簽、用戶輸入等。 - 使用場景:
- 當字符串內(nèi)容不頻繁變化時適合使用
String
,例如拼接少量字符串。 - 因為不可變特性,
String
對多線程是天然安全的,不會受到并發(fā)修改的影響。
- 當字符串內(nèi)容不頻繁變化時適合使用
示例代碼:
String str = "Hello"; str += " World"; // 會創(chuàng)建新的字符串對象 "Hello World" System.out.println(str); // 輸出 "Hello World"
- Java中的String類不可以被繼承,因為String類被聲明為
final
,禁止其他類繼承它。- String類型的“+”方法的底層實現(xiàn):編譯器將
+
轉(zhuǎn)換為StringBuilder
的append()
鏈式調(diào)用,最后調(diào)用toString()
生成新String對象。
2. StringBuffer
- 特性:
StringBuffer
是可變類(mutable),它在修改時不會創(chuàng)建新的對象。適合需要頻繁修改字符串的場景。StringBuffer
是線程安全的,每個方法都加了synchronized
關鍵字,保證在多線程環(huán)境下的安全性。- 作用:在多線程環(huán)境中需要頻繁操作字符串時,
StringBuffer
是更合適的選擇。 - 使用場景:
- 當多個線程可能會同時操作同一字符串時使用
StringBuffer
。 - 在需要大量拼接字符串且要求線程安全的場景下,如在
append
、insert
等操作中使用。
- 當多個線程可能會同時操作同一字符串時使用
示例代碼:
StringBuffer sb = new StringBuffer("Hello"); sb.append(" World"); System.out.println(sb.toString()); // 輸出 "Hello World"
3. StringBuilder
- 特性:
StringBuilder
也是可變類,與StringBuffer
的用法基本相同,適合頻繁修改字符串內(nèi)容的場景。但與StringBuffer
不同的是,StringBuilder
不是線程安全的,因此在單線程環(huán)境中,StringBuilder
的性能更高。 - 作用:在單線程環(huán)境下,
StringBuilder
可以替代StringBuffer
,提供更高的性能。 - 使用場景:
- 單線程環(huán)境下,頻繁修改字符串的場合使用
StringBuilder
。 - 推薦在需要拼接大量字符串且不涉及多線程的場景中使用
StringBuilder
。
- 單線程環(huán)境下,頻繁修改字符串的場合使用
示例代碼:
StringBuilder sb = new StringBuilder("Hello"); sb.append(" World"); System.out.println(sb.toString()); // 輸出 "Hello World"
總結對比
特性 | String | StringBuffer | StringBuilder |
---|---|---|---|
是否可變 | 不可變 | 可變 | 可變 |
線程安全 | 是 | 是 | 否 |
性能 | 最低 | 中等 | 最高(單線程情況下) |
使用場景 | 少量字符串修改 | 多線程環(huán)境中大量字符串修改 | 單線程環(huán)境中大量字符串修改 |
StringBuilder
、StringBuffer
和 String
之間的轉(zhuǎn)換方法
(1)String 轉(zhuǎn) StringBuilder / StringBuffer
使用 構造方法 直接轉(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
都有類似的構造方法,可以直接通過構造方法進行轉(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
是不可變的,每次修改都會返回一個新對象。以下是常用方法:
1.1 charAt(int index)
獲取指定位置的字符。
String str = "Hello"; char ch = str.charAt(1); // 'e'
1.2 concat(String str)
拼接字符串,返回一個新的字符串。
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)換為大寫或小寫,返回新字符串。
String str = "Hello World"; String upper = str.toUpperCase(); // "HELLO WORLD"
1.5 replace(char oldChar, char newChar)
替換字符,返回新的字符串。replace()
方法有兩個重載版本:
(1)replace(char oldChar, char newChar)
用于替換單個字符,參數(shù)是 char
類型,需要用單引號。
String str = "Hello World"; String noSpaceStr = str.replace(' ', ''); // 錯誤!第二個參數(shù)不能為空字符
注意:這里有一個問題,newChar
不能為空字符(''
),因為 Java 中字符不能為空。所以這種方法不適用于去除空格。
(2)replace(CharSequence target, CharSequence replacement)
用于替換字符串,參數(shù)是 CharSequence
類型(String
是其子類),需要用雙引號。
String str = "Hello World"; String noSpaceStr = str.replace(" ", ""); // 正確!用空字符串替換空格字符串
為什么用雙引號?
在去除空格時,我們通常希望將空格字符串(" "
)替換為空字符串(""
),而不是替換單個字符。因此,使用雙引號的 replace(" ", "")
是正確的做法。
1.6 split(String regex)
根據(jù)正則表達式分割字符串,返回字符串數(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
類的靜態(tài)方法 valueOf
也可以將 char
數(shù)組轉(zhuǎn)換為 String
。
char[] charArray = {'H', 'e', 'l', 'l', 'o'}; String str = String.valueOf(charArray); // "Hello"
2. StringBuffer
的常用方法
StringBuffer
是可變的,支持在原對象上修改字符串。以下是一些常見的方法:
2.1 append(String str)(有重載版本添加其他數(shù)據(jù)類型,比如char)
在末尾添加字符串,修改原對象。
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); // 刪除最后一個字符 '?' System.out.println(sbf); // 輸出: Java
3. StringBuilder
的常用方法
StringBuilder
與 StringBuffer
方法相同,但不加鎖,適合單線程場景。以下列舉常用方法:
3.1 append(String str) (有重載版本添加其他數(shù)據(jù)類型,比如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
到此這篇關于Java字符串的處理的文章就介紹到這了,更多相關Java字符串處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java 中的instanceof用法詳解及instanceof是什么意思(推薦)
instanceof 是 Java 的保留關鍵字。它的作用是測試它左邊的對象是否是它右邊的類的實例,返回 boolean 的數(shù)據(jù)類型。接下來通過本文給大家介紹java 中的instanceof用法詳解及instanceof是什么意思,需要的朋友參考下吧2017-11-11springboot根據(jù)實體類生成表的實現(xiàn)方法
本文介紹了如何通過SpringBoot工程引入SpringDataJPA,并通過實體類自動生成數(shù)據(jù)庫表的過程,包括常見問題解決方法,感興趣的可以了解一下2024-09-09Java中wait與sleep的區(qū)別講解(wait有參及無參區(qū)別)
這篇文章主要介紹了Java中wait與sleep的講解(wait有參及無參區(qū)別),通過代碼介紹了wait()?與wait(?long?timeout?)?區(qū)別,wait(0)?與?sleep(0)區(qū)別,需要的朋友可以參考下2022-04-04SpringMVC之DispatcherServlet配置文件應該放在哪里呢
這篇文章主要介紹了SpringMVC之DispatcherServlet配置文件應該放在哪里的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11詳解springboot使用異步注解@Async獲取執(zhí)行結果的坑
本文主要介紹了springboot使用異步注解@Async獲取執(zhí)行結果的坑,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08JAVA加密算法- 非對稱加密算法(DH,RSA)的詳細介紹
這篇文章主要介紹了JAVA加密算法- 非對稱加密算法(DH,RSA),詳細介紹了DH,RSA的用法和示例,需要的朋友可以了解一下。2016-11-11