Java String、StringBuffer和StringBuilder的区别
Java String、StringBuffer和StringBuilder的區別
- 1.String類
- 2.StringBuffer
- 概述
- String VS StringBuffer
- StringBuffer三種構造器初始化
- String和StringBuffer的轉換
- 3.StringBuilder
- 概述
- 常用API
- 4.總結
1.String類
字符串廣泛應用 在 Java 編程中,在 Java 中字符串屬于對象,Java 提供了 String 類來創建和操作字符串。
String對象實現了Serializable接口,說明String對象可以串行化(在網絡中進行傳輸),同時實現了Comparable接口,說明String對象可以進行比較🍥
String是個final類,這代表它是不可被繼承的,不可被修改的(地址層面)
String的本質依然是char數組(或者byte數組,要看JDK的版本),通過源碼我們可以輕松的得知:
// JDK1.9及之后的版本,String的字符串內容保存在一個叫做value的byte數組中 @Stable private final byte[] value; // 注意這里的value數組是一個final類型,這代表它是不可以被修改的,這里指的是value的地址不能發生修改,而并非value數組里的值總結:jdk1.8及以前String使用的是char數組,jdk1.9及以后使用的是byte數組🥮
為什么改成byte數組了呢?
因為開發人員發現人們使用的字符串值是拉丁字符居多而之前使用的char數組每一個char占用兩個字節而拉丁字符只需要一個字節就可以存儲,剩下的一個字節就浪費了,造成內存的浪費,gc的更加頻繁。因此在jdk9中將String底層的實現改為了byte數組。
2.StringBuffer
概述
當對字符串進行修改的時候,需要使用 StringBuffer 和 StringBuilder 類。
和 String 類不同的是,StringBuffer 和 StringBuilder 類的對象能夠被多次的修改,并且不產生新的未使用對象。這極大的節省了資源的使用
StringBuffer的本質依然是char數組(或者byte數組,要看JDK的版本)但是和String不同的是,該數組不是final類型的🍢但是和String類一樣,StringBuffer類本身也是final類型,代表它不能被繼承!🧆
String VS StringBuffer
String是不可變的對象,因此每次在對String類進行改變的時候都會生成一個新的String對象,然后將指針指向新的String對象,所以經常要改變字符串長度的話不要使用String,因為每次生成對象都會對系統性能產生影響,特別是當內存中引用的對象多了以后,JVM的GC就會開始工作,性能就會降低
使用StringBuffer類時,每次都會對StringBuffer對象本身進行操作,而不是生成新的對象并改變對象引用,所以多數情況下推薦使用StringBuffer,特別是字符串對象經常要改變的情況
StringBuffer三種構造器初始化
// 創建一個大小為16的char[] 數組,用于存放字符內容 StringBuffer a= new StringBuffer(); // 指定char[]容量大小 StringBuffer b= new StringBuffer(100); // 通過給一個string創建stringbuffer,初始容量為字符串長度 + 16 StringBuffer c= new StringBuffer("dahezhiquan");String和StringBuffer的轉換
String --> StringBuffer
// String --> StringBuffer String str = "hello"; // 方法一:通過構造器 StringBuffer a= new StringBuffer(str); // 方法二:通過append方法 StringBuffer b= new StringBuffer(); b.append(str);StringBuffer --> String
// StringBuffer --> String StringBuffer a= new StringBuffer("lsp"); // 方法一:通過toString方法 String b= a.toString(); // 方法二:使用構造器 String c= new String(a);3.StringBuilder
概述
一個可變的字符序列,此類提供一個與StringBuffer兼容的API,但不保證同步(不是線程安全的),用在字符串緩沖區被單個線程使用的時候,如果可能建議優先使用該類,因為在大多數的時候,它比StringBuffer要快
StringBuilder類是final類型,不能被繼承!StringBuilder的本質依然是char數組(或者byte數組,要看JDK的版本),該數組不是final類型的🫕
常用API
StringBuilder append(String str):
添加一部分內容
StringBuilder stringBuilder = new StringBuilder("wode"); stringBuilder.append("shijie"); System.out.println(stringBuilder); // wodeshijievoid setCharAt(int i, char c):
將第i個代碼單元設置為c
StringBuilder stringBuilder = new StringBuilder("wode"); stringBuilder.setCharAt(0, 't'); System.out.println(stringBuilder); // todeStringBuilder insert(int offset, String str):
在offset位置插入一個字符串
StringBuilder stringBuilder = new StringBuilder("wode"); stringBuilder.insert(1, "dada"); System.out.println(stringBuilder); // wdadaodeStringBuilder delete(int startIndex, int endIndex):
刪除偏移量從startIndex到-endIndex-1的代碼單元
StringBuilder stringBuilder = new StringBuilder("wodeshijie"); stringBuilder.delete(1, 3); System.out.println(stringBuilder); // weshijie4.總結
去留無意,閑看庭前花開花落;寵辱不驚,漫隨天外云卷云舒。🍝
總結
以上是生活随笔為你收集整理的Java String、StringBuffer和StringBuilder的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么设置电脑的开机关机时间
- 下一篇: 双摄像头立体成像(一)-成像原理