詳解Java中String,StringBuffer和StringBuilder的使用
1.String類
字符串廣泛應用 在 Java 編程中,在 Java 中字符串屬于對象,Java 提供了 String 類來創(chuàng)建和操作字符串。
String對象實現了Serializable接口,說明String對象可以串行化(在網絡中進行傳輸),同時實現了Comparable接口,說明String對象可以進行比較
String是個final類,這代表它是不可被繼承的
String的本質依然是char數組(或者byte數組,要看JDK的版本),通過源碼我們可以輕松的得知:
// JDK1.9及之后的版本,String的字符串內容保存在一個叫做value的byte數組中 @Stable private final byte[] value; // 注意這里的value數組是一個final類型,這代表它是不可以被修改的,這里指的是value的地址不能發(fā)生修改,而并非value數組里的值
jdk1.8及以前String使用的是char數組,jdk1.9及以后使用的是byte數組。
因為開發(fā)人員發(fā)現人們使用的字符串值是拉丁字符居多而之前使用的char數組每一個char占用兩個字節(jié)而拉丁字符只需要一個字節(jié)就可以存儲,剩下的一個字節(jié)就浪費了,造成內存的浪費,gc的更加頻繁。因此在jdk9中將String底層的實現改為了byte數組。
2.String對象創(chuàng)建的兩種方式
// 直接賦值 String name = "dahe"; System.out.println(name); // 調用構造器賦值 String wodeshijie = new String("wodeshijie"); System.out.println(wodeshijie);
兩種對象創(chuàng)建方式的區(qū)別:
直接賦值:現在常量池中看是否存在該字符串,存在則直接指向,不存在則創(chuàng)建后指向
new的方式:先在堆中新建一個對象空間,通過value數組在常量池中尋找該字符串,有的話就將地址返回給value,沒有的話就先創(chuàng)建再將地址返回給value
經典面試題A:
會創(chuàng)建一個對象,編譯器會對該代碼進行優(yōu)化,a存儲的字符串等價于helloabc
經典面試題B:(該代碼塊創(chuàng)建幾個對象)
// 面試題 String a = "hello"; String b = "world"; String c = a + b;
會創(chuàng)建三個對象,a對象和b對象,c對象的創(chuàng)建其實是在堆中,堆中的地址指向字符串常量池的一個helloworld對象常量相加看的是池,變量相加是在堆中!
3.String常用方法
直接上代碼演示:
/** * String練習 */ public class StringTest { public static void main(String[] args) { // 直接賦值 String name = "dahe"; System.out.println(name); // 調用構造器賦值 String wodeshijie = new String("wodeshijie"); System.out.println(wodeshijie); // String類的常用方法 String a = "imustctf"; String b = "Imustctf"; // 判斷兩字符串的值是否相等(區(qū)分大小寫) System.out.println(a.equals(b)); // 判斷兩字符串的值是否相等不區(qū)分大小寫) System.out.println(a.equalsIgnoreCase(b)); // 獲取字符個數 System.out.println(a.length()); // 獲取子字符串在字符串對象中第一次出現的索引位置,找不到返回-1 int index = a.indexOf('m'); System.out.println(index); // 獲取子字符串在字符串對象中最后一次出現的索引位置,找不到返回-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的所有字符 // 字符串轉大寫 System.out.println(a.toUpperCase()); // 字符串轉小寫 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 春日山中對雪 = "竹樹無聲或有聲,霏霏漠漠散還凝," + "嶺梅謝后重妝蕊,巖水鋪來卻結冰," + "牢系鹿兒防獵客,滿添茶鼎候吟僧," + "好將膏雨同功力,松徑莓苔又一層"; String[] splitRes = 春日山中對雪.split(","); for (String splitRe : splitRes) { System.out.println(splitRe); } // 字符串轉化為字符數組 char[] chs = a.toCharArray(); for (char ch : chs) { System.out.println(ch); } // 字符串比較,前者大返回正數,后者大返回負數,相等返回0 System.out.println("abcd".compareTo("abcz")); // 字符串格式化 String info = String.format("網站名字%s,首字母大寫后%s", a, b); System.out.println(info); } }
輸出:
false
true
8
1
6
ustctf
ust
IMUSTCTF
imustctf
beginimustctfImustctf
endimustctfImustctf
竹樹無聲或有聲
霏霏漠漠散還凝
嶺梅謝后重妝蕊
巖水鋪來卻結冰
牢系鹿兒防獵客
滿添茶鼎候吟僧
好將膏雨同功力
松徑莓苔又一層
i
m
u
s
t
c
t
f
-22
網站名字imustctf,首字母大寫后Imustctf
4.StringBuffer
概述
當對字符串進行修改的時候,需要使用 StringBuffer 和 StringBuilder 類。
和 String 類不同的是,StringBuffer 和 StringBuilder 類的對象能夠被多次的修改,并且不產生新的未使用對象。
在使用 StringBuffer 類時,每次都會對 StringBuffer 對象本身進行操作,而不是生成新的對象,所以如果需要對字符串進行修改推薦使用 StringBuffer。
StringBuffer的本質依然是char數組(或者byte數組,要看JDK的版本)但是和String不同的是,該數組不是final類型的和String類一樣,StringBuffer類也是final類型,代表它不能被繼承!
String VS StringBuffer:
StringBuffer三種構造器初始化
// 創(chuàng)建一個大小為16的char[] 數組,用于存放字符內容 StringBuffer stringBuffer = new StringBuffer(); // 指定char[]容量大小 StringBuffer stringBuffer1 = new StringBuffer(100); // 通過給一個string創(chuàng)建stringbuffer,初始容量為字符串長度 + 16 StringBuffer dahezhiquan = new StringBuffer("dahezhiquan");
String和StringBuffer的轉換
String --> StringBuffer
// String --> StringBuffer String str = "hello"; // 方法一:通過構造器 StringBuffer stringBuffer2 = new StringBuffer(str); // 方法二:通過append StringBuffer stringBuffer3 = new StringBuffer(); stringBuffer3.append(str);
StringBuffer --> String
// StringBuffer --> String StringBuffer stringBuffer4 = new StringBuffer("lsp"); // 方法一:通過toString方法 String s = stringBuffer4.toString(); // 方法二:使用構造器 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); // 長度 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
概述
一個可變的字符序列,此類提供一個與StringBuffer兼容的API,但不保證同步(不是線程安全的),用在字符串緩沖區(qū)被單個線程使用的時候,如果可能建議優(yōu)先使用該類,因為在大多數的時候,它比StringBuffer要快
StringBuilder類是final類型,不能被繼承!StringBuilder的本質依然是char數組(或者byte數組,要看JDK的版本),該數組不是final類型
StringBuilder和StringBuffer同屬一個父類,故他們的方法一致
現在我們來看一下String,StringBuffer,StringBuilder的區(qū)別:
到此這篇關于詳解Java中String,StringBuffer和StringBuilder的使用的文章就介紹到這了,更多相關Java String內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- 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詳細分析String類與StringBuffer和StringBuilder的使用方法
- Java中String、StringBuffer和StringBuilder的區(qū)別與使用場景
相關文章
使用@JsonFormat和@DateTimeFormat對Date格式化操作
這篇文章主要介紹了使用@JsonFormat和@DateTimeFormat對Date格式化操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08