詳解Java中String,StringBuffer和StringBuilder的使用
1.String類
字符串廣泛應(yīng)用 在 Java 編程中,在 Java 中字符串屬于對(duì)象,Java 提供了 String 類來(lái)創(chuàng)建和操作字符串。
String對(duì)象實(shí)現(xiàn)了Serializable接口,說(shuō)明String對(duì)象可以串行化(在網(wǎng)絡(luò)中進(jìn)行傳輸),同時(shí)實(shí)現(xiàn)了Comparable接口,說(shuō)明String對(duì)象可以進(jìn)行比較
String是個(gè)final類,這代表它是不可被繼承的
String的本質(zhì)依然是char數(shù)組(或者byte數(shù)組,要看JDK的版本),通過(guò)源碼我們可以輕松的得知:
// JDK1.9及之后的版本,String的字符串內(nèi)容保存在一個(gè)叫做value的byte數(shù)組中 @Stable private final byte[] value; // 注意這里的value數(shù)組是一個(gè)final類型,這代表它是不可以被修改的,這里指的是value的地址不能發(fā)生修改,而并非value數(shù)組里的值
jdk1.8及以前String使用的是char數(shù)組,jdk1.9及以后使用的是byte數(shù)組。
因?yàn)殚_(kāi)發(fā)人員發(fā)現(xiàn)人們使用的字符串值是拉丁字符居多而之前使用的char數(shù)組每一個(gè)char占用兩個(gè)字節(jié)而拉丁字符只需要一個(gè)字節(jié)就可以存儲(chǔ),剩下的一個(gè)字節(jié)就浪費(fèi)了,造成內(nèi)存的浪費(fèi),gc的更加頻繁。因此在jdk9中將String底層的實(shí)現(xiàn)改為了byte數(shù)組。
2.String對(duì)象創(chuàng)建的兩種方式
// 直接賦值
String name = "dahe";
System.out.println(name);
// 調(diào)用構(gòu)造器賦值
String wodeshijie = new String("wodeshijie");
System.out.println(wodeshijie);
兩種對(duì)象創(chuàng)建方式的區(qū)別:
直接賦值:現(xiàn)在常量池中看是否存在該字符串,存在則直接指向,不存在則創(chuàng)建后指向

new的方式:先在堆中新建一個(gè)對(duì)象空間,通過(guò)value數(shù)組在常量池中尋找該字符串,有的話就將地址返回給value,沒(méi)有的話就先創(chuàng)建再將地址返回給value

經(jīng)典面試題A:

會(huì)創(chuàng)建一個(gè)對(duì)象,編譯器會(huì)對(duì)該代碼進(jìn)行優(yōu)化,a存儲(chǔ)的字符串等價(jià)于helloabc
經(jīng)典面試題B:(該代碼塊創(chuàng)建幾個(gè)對(duì)象)
// 面試題 String a = "hello"; String b = "world"; String c = a + b;
會(huì)創(chuàng)建三個(gè)對(duì)象,a對(duì)象和b對(duì)象,c對(duì)象的創(chuàng)建其實(shí)是在堆中,堆中的地址指向字符串常量池的一個(gè)helloworld對(duì)象常量相加看的是池,變量相加是在堆中!
3.String常用方法
直接上代碼演示:
/**
* String練習(xí)
*/
public class StringTest {
public static void main(String[] args) {
// 直接賦值
String name = "dahe";
System.out.println(name);
// 調(diào)用構(gòu)造器賦值
String wodeshijie = new String("wodeshijie");
System.out.println(wodeshijie);
// String類的常用方法
String a = "imustctf";
String b = "Imustctf";
// 判斷兩字符串的值是否相等(區(qū)分大小寫(xiě))
System.out.println(a.equals(b));
// 判斷兩字符串的值是否相等不區(qū)分大小寫(xiě))
System.out.println(a.equalsIgnoreCase(b));
// 獲取字符個(gè)數(shù)
System.out.println(a.length());
// 獲取子字符串在字符串對(duì)象中第一次出現(xiàn)的索引位置,找不到返回-1
int index = a.indexOf('m');
System.out.println(index);
// 獲取子字符串在字符串對(duì)象中最后一次出現(xiàn)的索引位置,找不到返回-1
int lastIndex = a.lastIndexOf('t');
System.out.println(lastIndex);
// 字符串截取
System.out.println(a.substring(2)); // 截取2后面的所有字符
System.out.println(a.substring(2, 5)); // 截取0 - 4的所有字符
// 字符串轉(zhuǎn)大寫(xiě)
System.out.println(a.toUpperCase());
// 字符串轉(zhuǎn)小寫(xiě)
System.out.println(b.toLowerCase());
// 字符串拼接
String c = "begin";
c = c.concat(a).concat(b);
System.out.println(c);
// 替換
c = c.replace("begin", "end");
System.out.println(c);
// 分割字符串
String 春日山中對(duì)雪 = "竹樹(shù)無(wú)聲或有聲,霏霏漠漠散還凝," +
"嶺梅謝后重妝蕊,巖水鋪來(lái)卻結(jié)冰," +
"牢系鹿兒防獵客,滿添茶鼎候吟僧," +
"好將膏雨同功力,松徑莓苔又一層";
String[] splitRes = 春日山中對(duì)雪.split(",");
for (String splitRe : splitRes) {
System.out.println(splitRe);
}
// 字符串轉(zhuǎn)化為字符數(shù)組
char[] chs = a.toCharArray();
for (char ch : chs) {
System.out.println(ch);
}
// 字符串比較,前者大返回正數(shù),后者大返回負(fù)數(shù),相等返回0
System.out.println("abcd".compareTo("abcz"));
// 字符串格式化
String info = String.format("網(wǎng)站名字%s,首字母大寫(xiě)后%s", a, b);
System.out.println(info);
}
}輸出:
false
true
8
1
6
ustctf
ust
IMUSTCTF
imustctf
beginimustctfImustctf
endimustctfImustctf
竹樹(shù)無(wú)聲或有聲
霏霏漠漠散還凝
嶺梅謝后重妝蕊
巖水鋪來(lái)卻結(jié)冰
牢系鹿兒防獵客
滿添茶鼎候吟僧
好將膏雨同功力
松徑莓苔又一層
i
m
u
s
t
c
t
f
-22
網(wǎng)站名字imustctf,首字母大寫(xiě)后Imustctf
4.StringBuffer
概述
當(dāng)對(duì)字符串進(jìn)行修改的時(shí)候,需要使用 StringBuffer 和 StringBuilder 類。
和 String 類不同的是,StringBuffer 和 StringBuilder 類的對(duì)象能夠被多次的修改,并且不產(chǎn)生新的未使用對(duì)象。

在使用 StringBuffer 類時(shí),每次都會(huì)對(duì) StringBuffer 對(duì)象本身進(jìn)行操作,而不是生成新的對(duì)象,所以如果需要對(duì)字符串進(jìn)行修改推薦使用 StringBuffer。
StringBuffer的本質(zhì)依然是char數(shù)組(或者byte數(shù)組,要看JDK的版本)但是和String不同的是,該數(shù)組不是final類型的和String類一樣,StringBuffer類也是final類型,代表它不能被繼承!
String VS StringBuffer:

StringBuffer三種構(gòu)造器初始化
// 創(chuàng)建一個(gè)大小為16的char[] 數(shù)組,用于存放字符內(nèi)容
StringBuffer stringBuffer = new StringBuffer();
// 指定char[]容量大小
StringBuffer stringBuffer1 = new StringBuffer(100);
// 通過(guò)給一個(gè)string創(chuàng)建stringbuffer,初始容量為字符串長(zhǎng)度 + 16
StringBuffer dahezhiquan = new StringBuffer("dahezhiquan");
String和StringBuffer的轉(zhuǎn)換
String --> StringBuffer
// String --> StringBuffer String str = "hello"; // 方法一:通過(guò)構(gòu)造器 StringBuffer stringBuffer2 = new StringBuffer(str); // 方法二:通過(guò)append StringBuffer stringBuffer3 = new StringBuffer(); stringBuffer3.append(str);
StringBuffer --> String
// StringBuffer --> String
StringBuffer stringBuffer4 = new StringBuffer("lsp");
// 方法一:通過(guò)toString方法
String s = stringBuffer4.toString();
// 方法二:使用構(gòu)造器
String s1 = new String(stringBuffer4);
StringBuffer的常用方法
代碼示例:
// StringBuffer的常用方法
StringBuffer imustctf = new StringBuffer("imustctf");
// 追加操作
imustctf.append(" nice");
imustctf.append(" yes").append(true).append(5.21).append(1314);
System.out.println(imustctf);
// 刪除操作
// 刪除索引為5到6的字符
imustctf.delete(5,7);
System.out.println(imustctf);
// 修改操作,替換9到10的字符為方文杰
imustctf.replace(9,11,"方文杰");
System.out.println(imustctf);
// 查找操作
int index = imustctf.indexOf("方文杰");
System.out.println(index);
// 插入操作,在索引為9的后面插入張三
imustctf.insert(9,"張三");
System.out.println(imustctf);
// 長(zhǎng)度
System.out.println(imustctf.length());
輸出:
imustctf nice yestrue5.211314
imustf nice yestrue5.211314
imustf ni方文杰 yestrue5.211314
9
imustf ni張三方文杰 yestrue5.211314
30
5.StringBuilder
概述
一個(gè)可變的字符序列,此類提供一個(gè)與StringBuffer兼容的API,但不保證同步(不是線程安全的),用在字符串緩沖區(qū)被單個(gè)線程使用的時(shí)候,如果可能建議優(yōu)先使用該類,因?yàn)樵诖蠖鄶?shù)的時(shí)候,它比StringBuffer要快
StringBuilder類是final類型,不能被繼承!StringBuilder的本質(zhì)依然是char數(shù)組(或者byte數(shù)組,要看JDK的版本),該數(shù)組不是final類型
StringBuilder和StringBuffer同屬一個(gè)父類,故他們的方法一致
現(xiàn)在我們來(lái)看一下String,StringBuffer,StringBuilder的區(qū)別:

到此這篇關(guān)于詳解Java中String,StringBuffer和StringBuilder的使用的文章就介紹到這了,更多相關(guān)Java String內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中String、StringBuffer和StringBuilder的區(qū)別
- Java中的String、StringBuilder、StringBuffer三者的區(qū)別詳解
- Java中StringBuilder與StringBuffer的區(qū)別
- Java中StringBuilder與StringBuffer使用及源碼解讀
- 淺析Java中StringBuffer和StringBuilder的使用
- Java StringBuffer與StringBuilder有什么區(qū)別
- Java中String和StringBuffer及StringBuilder?有什么區(qū)別
- Java源碼深度分析String與StringBuffer及StringBuilder詳解
- Java詳細(xì)分析String類與StringBuffer和StringBuilder的使用方法
- Java中String、StringBuffer和StringBuilder的區(qū)別與使用場(chǎng)景
相關(guān)文章
使用@JsonFormat和@DateTimeFormat對(duì)Date格式化操作
這篇文章主要介紹了使用@JsonFormat和@DateTimeFormat對(duì)Date格式化操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
SpringBoot如何實(shí)現(xiàn)并發(fā)任務(wù)并返回結(jié)果
這篇文章主要介紹了SpringBoot如何實(shí)現(xiàn)并發(fā)任務(wù)并返回結(jié)果問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Java設(shè)置PDF有序和無(wú)序列表的知識(shí)點(diǎn)總結(jié)
在本篇文章中小編給大家整理了關(guān)于Java設(shè)置PDF有序和無(wú)序列表的知識(shí)點(diǎn),需要的朋友們參考下。2019-03-03
關(guān)于Java中的try-with-resources語(yǔ)句
這篇文章主要介紹了關(guān)于Java中的try-with-resources語(yǔ)句,try-with-resources是Java中的環(huán)繞語(yǔ)句之一,旨在減輕開(kāi)發(fā)人員釋放try塊中使用的資源的義務(wù),需要的朋友可以參考下2023-05-05
java判斷遠(yuǎn)程服務(wù)器上的文件是否存在的方法
java判斷遠(yuǎn)程服務(wù)器上的文件是否存在的方法,需要的朋友可以參考一下2013-03-03
SpringBoot與單元測(cè)試JUnit的結(jié)合操作
這篇文章主要介紹了SpringBoot與單元測(cè)試JUnit的結(jié)合操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10

