Java中String類(StringBuffer、StringBuilder)相關(guān)(最新推薦)
String是Java中用于表示字符串的類,位于java.lang包下(無需手動(dòng)導(dǎo)入)。
兩個(gè)核心特性:
- 不可變性(Immutable):String 對(duì)象一旦創(chuàng)建,其內(nèi)部的字符序列就無法被修改??此菩薷淖址牟僮鳎ㄈ缙唇?、替換),本質(zhì)都是創(chuàng)建了一個(gè)新的String對(duì)象。
- 字符串常量池:直接賦值創(chuàng)建的String對(duì)象會(huì)存入JVM的字符串常量池,目的是復(fù)用相同內(nèi)容的字符串,節(jié)省內(nèi)存。
String對(duì)象的兩種創(chuàng)建方式
public class StringCreateDemo {
public static void main(String[] args) {
// 方式1:直接賦值(推薦)—— 從常量池獲取/創(chuàng)建對(duì)象
String s1 = "Hello";
String s2 = "Hello";
// == 比較的是對(duì)象的內(nèi)存地址,s1和s2指向常量池同一個(gè)對(duì)象
System.out.println(s1 == s2); // 輸出:true
// 方式2:new關(guān)鍵字 —— 每次new都會(huì)在堆內(nèi)存創(chuàng)建新對(duì)象
String s3 = new String("Hello");
String s4 = new String("Hello");
System.out.println(s3 == s4); // 輸出:false
// 正確比較字符串內(nèi)容:用equals()方法(String重寫了Object的equals)
System.out.println(s1.equals(s3)); // 輸出:true
}
}String類的常用方法
public class StringMethodsDemo {
public static void main(String[] args) {
String str = " Hello Java! ";
// 1. 獲取字符串長(zhǎng)度:length()
int len = str.length();
System.out.println("長(zhǎng)度:" + len); // 輸出:14(包含首尾空格)
// 2. 獲取指定索引的字符:charAt(int index)(索引從0開始)
char c = str.charAt(3);
System.out.println("索引3的字符:" + c); // 輸出:l
// 3. 去除首尾空格:trim()(JDK11+可用strip())
String trimStr = str.trim();
System.out.println("去空格后:" + trimStr); // 輸出:Hello Java!
// 4. 大小寫轉(zhuǎn)換
String upperStr = trimStr.toUpperCase(); // 轉(zhuǎn)大寫
String lowerStr = trimStr.toLowerCase(); // 轉(zhuǎn)小寫
System.out.println("大寫:" + upperStr); // 輸出:HELLO JAVA!
System.out.println("小寫:" + lowerStr); // 輸出:hello java!
// 5. 判斷是否包含指定子串:contains(CharSequence s)
boolean hasJava = trimStr.contains("Java");
System.out.println("包含Java?" + hasJava); // 輸出:true
// 6. 截取子串:substring(int beginIndex[, int endIndex])
// 注意:endIndex是結(jié)束索引(不包含),左閉右開
String sub1 = trimStr.substring(6); // 從索引6截取到末尾
String sub2 = trimStr.substring(0, 5); // 截取0-4索引的字符
System.out.println("sub1:" + sub1); // 輸出:Java!
System.out.println("sub2:" + sub2); // 輸出:Hello
// 7. 分割字符串:split(String regex)
String[] splitArr = trimStr.split(" "); // 按空格分割
System.out.println("分割后數(shù)組:" + Arrays.toString(splitArr)); // 輸出:[Hello, Java!]
// 8. 替換字符/子串:replace(CharSequence old, CharSequence new)
String replaceStr = trimStr.replace("Java", "World");
System.out.println("替換后:" + replaceStr); // 輸出:Hello World!
// 9. 判斷字符串是否為空/空白:isEmpty()、isBlank()(JDK11+)
String emptyStr = "";
String blankStr = " ";
System.out.println(emptyStr.isEmpty()); // 輸出:true
System.out.println(blankStr.isBlank()); // 輸出:true(JDK11+)
}
}String不可變性的影響
- 因?yàn)镾tring不可變,頻繁拼接字符串(如循環(huán)中str += "xxx")會(huì)創(chuàng)建大量臨時(shí)對(duì)象,效率極低。此時(shí)應(yīng)使用StringBuilder(非線程安全,效率高)或StringBuffer(線程安全,效率稍低)
StringBuffer和StringBuilder
- 它們是可變的字符序列,底層基于可擴(kuò)容的字符數(shù)組實(shí)現(xiàn),修改(拼接、插入、刪除)時(shí)不會(huì)創(chuàng)建新對(duì)象,而是直接操作底層數(shù)組,效率大幅提升。
StringBuffer和StringBuilder的核心區(qū)別
| 特性 | StringBuffer | StringBuilder |
|---|---|---|
| 線程安全 | 線程安全(方法加了synchronized鎖) | 非線程安全(無同步鎖) |
| 執(zhí)行效率 | 稍低(鎖的開銷) | 更高(無鎖的開銷) |
| 適用場(chǎng)景 | 多線程環(huán)境(如多線程拼接字符串) | 單線程環(huán)境(日常開發(fā)絕大多數(shù)場(chǎng)景) |
| 誕生版本 | JDK 1.0 | JDK 1.5(為彌補(bǔ) StringBuffer 效率問題) |
常用方法
import java.util.Arrays;
public class StringBuildBufferDemo {
public static void main(String[] args) {
// 1. 創(chuàng)建StringBuilder對(duì)象(初始容量16,可指定容量減少擴(kuò)容次數(shù))
StringBuilder sb = new StringBuilder(); // 空構(gòu)造,初始容量16
// StringBuilder sb = new StringBuilder(32); // 指定初始容量,避免頻繁擴(kuò)容
// 2. 拼接內(nèi)容:append()(核心方法,支持所有數(shù)據(jù)類型)
sb.append("Hello");
sb.append(" ");
sb.append("Java");
sb.append(8); // 拼接數(shù)字
System.out.println("拼接后:" + sb); // 輸出:Hello Java8
// 3. 插入內(nèi)容:insert(int offset, 內(nèi)容)
sb.insert(6, "My "); // 在索引6的位置插入"My "
System.out.println("插入后:" + sb); // 輸出:Hello My Java8
// 4. 替換內(nèi)容:replace(int start, int end, String str)(左閉右開)
sb.replace(6, 9, "New"); // 替換索引6-8的內(nèi)容為"New"
System.out.println("替換后:" + sb); // 輸出:Hello New Java8
// 5. 反轉(zhuǎn)字符串:reverse()
sb.reverse();
System.out.println("反轉(zhuǎn)后:" + sb); // 輸出:8avaJ weN olleH
// 6. 刪除內(nèi)容:delete(int start, int end)
sb.delete(0, 1); // 刪除索引0的字符(8)
System.out.println("刪除后:" + sb); // 輸出:avaJ weN olleH
// 7. 轉(zhuǎn)為String(最終使用時(shí)一般要轉(zhuǎn)成String)
String finalStr = sb.toString();
System.out.println("最終String:" + finalStr); // 輸出:avaJ weN olleH
// 8. 獲取長(zhǎng)度:length()
System.out.println("當(dāng)前長(zhǎng)度:" + sb.length()); // 輸出:13
// ================== StringBuffer用法(僅創(chuàng)建方式不同) ==================
StringBuffer sbf = new StringBuffer("多線程場(chǎng)景");
sbf.append("使用StringBuffer");
System.out.println("StringBuffer結(jié)果:" + sbf); // 輸出:多線程場(chǎng)景使用StringBuffer
}
}三者對(duì)比
| 特性 | String | StringBuffer | StringBuilder |
|---|---|---|---|
| 可變性 | 不可變 | 可變 | 可變 |
| 線程安全 | 是 | 是 | 否 |
| 性能 | 低(頻繁操作時(shí)) | 中 | 高 |
| 引入版本 | JDK 1.0 | JDK 1.0 | JDK 1.5 |
總結(jié)
- 操作少量數(shù)據(jù):用 String。
- 單線程下操作大量字符串:用 StringBuilder。
- 多線程下操作大量字符串:用 StringBuffer。
- 判斷內(nèi)容相等:務(wù)必使用 equals() 而不是 ==。
到此這篇關(guān)于Java中String類(StringBuffer、StringBuilder)相關(guān)的文章就介紹到這了,更多相關(guān)Java String類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中StringBuilder與StringBuffer的區(qū)別
- Java中StringBuilder與StringBuffer使用及源碼解讀
- Java中String和StringBuffer及StringBuilder?有什么區(qū)別
- Java詳細(xì)分析String類與StringBuffer和StringBuilder的使用方法
- java中String StringBuffer和StringBuilder的區(qū)別詳解
- java中String、StringBuffer與StringBuilder的區(qū)別
- 兩萬(wàn)字詳解Java Sring String的常見操作以及StringBuffer StringBuilder的區(qū)別
- JAVA基礎(chǔ)類庫(kù)之String類,StringBuffer類和StringBuilder類
相關(guān)文章
如何基于Idea遠(yuǎn)程調(diào)試tomcat war包及jar包
這篇文章主要介紹了如何基于Idea遠(yuǎn)程調(diào)試tomcat war包及jar包,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
mybatis之嵌套查詢和嵌套結(jié)果有哪些區(qū)別
這篇文章主要介紹了mybatis之嵌套查詢和嵌套結(jié)果有哪些區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
SpringMVC @RequestBody Date類型的Json轉(zhuǎn)換方式
這篇文章主要介紹了SpringMVC @RequestBody Date類型的Json轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
淺談Java中ArrayList的擴(kuò)容機(jī)制
本文主要介紹了淺談Java中ArrayList的擴(kuò)容機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
IDEA2020.3創(chuàng)建web工程的完整步驟
這篇文章主要給大家介紹了關(guān)于IDEA2020.3創(chuàng)建web工程的完整步驟,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
SpringBoot3實(shí)現(xiàn)MySQL讀寫分離的完整指南
在高并發(fā)場(chǎng)景下,數(shù)據(jù)庫(kù)往往成為系統(tǒng)瓶頸,讀寫分離通過將寫操作定向到主庫(kù)、讀操作分發(fā)到從庫(kù),顯著提升系統(tǒng)讀性能和數(shù)據(jù)可用性,本文給大家介紹了SpringBoot3實(shí)現(xiàn)MySQL讀寫分離的完整指南,需要的朋友可以參考下2025-11-11
簡(jiǎn)單講解Java的Socket網(wǎng)絡(luò)編程的多播與廣播實(shí)現(xiàn)
這篇文章主要介紹了Java的Socket網(wǎng)絡(luò)編程的多播與廣播實(shí)現(xiàn),包括網(wǎng)絡(luò)編程發(fā)送和接受數(shù)據(jù)的一些基礎(chǔ)知識(shí)整理,需要的朋友可以參考下2016-01-01
關(guān)于spring?boot使用?jdbc+mysql?連接的問題
這篇文章主要介紹了spring?boot使用?jdbc+mysql?連接,在這里mysql?8.x版本驅(qū)動(dòng)包,要使用?com.mysql.cj.jdbc.Driver作為驅(qū)動(dòng)類,文中給大家詳細(xì)介紹,需要的朋友可以參考下2022-03-03
基于javaMybatis存進(jìn)時(shí)間戳的問題
這篇文章主要介紹了javaMybatis存進(jìn)時(shí)間戳的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

