>[success] # Java -- StringBuilder 和 StringBuffer
1. 由于**String**類描述的字符串內容是個**常量不可改變**,當需要在Java代碼中描述**大量類似的字符串時**,只能**單獨申請和存儲**,此時會造成內存**空間的浪費**
~~~
public class TestStr {
public static void main(String[] args) {
// 下面相當于開辟了三次空間 String 類型修改是字符串本身是個常量不會改變
String str = "123";
str = "123456";
str = "123456789";
}
}
~~~
2. 當我們使用大數據量字符串拼接時候發現會出現卡頓例如下面的代碼會卡頓一會才會出現結果
~~~
public class StringBuilderDemo1 {
public static void main(String[] args) {
String s = "";
for (int i = 0; i < 1000000; i++) {
s = s + "abc";
}
System.out.println(s);
}
}
~~~
* 這種情況下就可以使用`StringBuilder`
~~~
public class StringBuilderDemo2 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000000; i++) {
sb.append("abc");
}
System.out.println(sb);
}
}
~~~
3. 使用**java.lang.StringBuilder**類和**java.lang.StringBuffer**類來描述字符序列可**以改變的字符串** 解決每次都要單獨申請和儲存的問題
4. `StringBuffffer`類是從jdk1.0開始存在,**屬于線程安全的類,因此效率比較低**,`StringBuilder`類是從jdk1.5開始存在,**屬于非線程安全的類,效率比較高**。
5. 因為`StringBuilder`是Java已經寫好的類java在底層對他做了一些特殊處理。**打印對象不是地址值而是屬性值。**
6. 總結在使用場景上,**字符串的拼接**、**字符串的反轉** 這兩個場景推薦使用`StringBuilder`
>[info] ## 使用 StringBuilder
* 常用的構造方法
|方法聲明| 功能介紹|
|--|--|
|StringBuilder() |使用無參方式構造對象,容量為16|
|StringBuilder(int capacity) |根據參數指定的容量來構造對象,容量為參數指定大小|
|StringBuilder(String str) |根據參數指定的字符串來構造對象,容量為:16+字符串長度|
* 構造方法使用
~~~
public class TestStr {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder(29);
StringBuilder sb3 = new StringBuilder("hello");
}
}
~~~
* 常見的成員方法
|方法聲明 |功能介紹|
|--|--|
|int capacity() |用于返回調用對象的容量|
|int length() |用于返回字符串的長度,也就是字符的個數|
|StringBuilder insert(int offset, String str) |插入字符串并返回調用對象的引用,就是自己|
|StringBuilder append(String str) |追加字符串|
|StringBuilder deleteCharAt(int index)|將當前字符串中下標為index位置的單個字符刪除|
|StringBuilder delete(int start,int end) |刪除字符串|
|StringBuilder replace(int start,int end,String str)|替換字符串|
|StringBuilder reverse() |字符串反轉|
>[danger] ##### capacity 和 length 用法
~~~
public class TestStr {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder(29);
StringBuilder sb3 = new StringBuilder("hello");
// 打印字符串 自動調用toString方法 啥也沒有
System.out.println(sb1); // ''
System.out.println(sb2); // ''
System.out.println(sb3); // hello
// sb1 印容量capacity 和 長度length
System.out.println(sb1.capacity()); // 16
System.out.println(sb1.length()); // 0
// sb2 印容量capacity 和 長度length
System.out.println(sb2.capacity()); // 29
System.out.println(sb2.length()); // 0
// sb3 印容量capacity 和 長度length
System.out.println(sb3.capacity()); // 16 +5 = 21
System.out.println(sb3.length()); // 5
}
}
~~~
>[danger] ##### insert 插入字符串
~~~
public class TestStr {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder("hello");
// 向下標為0的位置插入字符串內容"abcd",也就是向開頭位置插入字符串內容
StringBuilder sb2 = sb1.insert(0, "abcd");
System.out.println(sb1); // abcdhello
System.out.println(sb2); // abcdhello
System.out.println(sb2 == sb1); // true // 會改變原字符串
// 從第四字符位置插入字符串"1234"
sb2.insert(4, "1234");
System.out.println(sb2); // abcd1234hello
// 從末尾添加字符串
// 向末尾位置插入字符串"ABCD"
sb2.insert(sb2.length(), "ABCD");
System.out.println(sb2); // abcd1234helloABCD
}
}
~~~
>[danger] ##### append -- 向末尾位置追加
~~~
public class TestStr {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder("hello");
// 向末尾位置追加字符串內容
sb1.append("aaa");
System.out.println(sb1); // helloaaa
}
}
~~~
>[danger] ##### deleteCharAt -- 刪除下角標對應位置字符
~~~
public class TestStr {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder("hello");
// 刪除刪除下標為1的單個字符
System.out.println(sb1.deleteCharAt(1)); // hllo
StringBuilder sb2 = new StringBuilder("abcdef");
// 使用循環依次刪除從腳本為2字符串
int index = 2;
for (int i = index; i < sb2.length(); i++) {
// 刪除一個字符后就跳過一個字符繼續刪除,因為每當刪除一個字符后后面的字符會向前補位,因為下標會發生變化
// 始終刪除下標為2的字符
sb2.deleteCharAt(i);
}
System.out.println(sb2); // abdf
// 利用倒序刪除
StringBuilder sb3 = new StringBuilder("abcdef");
int index1 = 2;
for (int i = sb3.length() - 1; i > index1; i--) {
sb3.deleteCharAt(i);
}
System.out.println(sb3); // abc
}
}
~~~
>[danger] ##### delete -- 刪除字符串
~~~
public class TestStr {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder("hello");
// 刪除刪除0 - 2的字符
System.out.println(sb1.delete(0, 2)); // llo
StringBuilder sb2 = new StringBuilder("hello");
// 刪除刪除1 - 結尾的字符
System.out.println(sb2.delete(1, sb2.length())); // h
}
}
~~~
>[danger] ##### setCharAt -- 內容的修改
~~~
public class TestStr {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder("hello");
sb1.setCharAt(0, 'z');
System.out.println(sb1); // zello
}
}
~~~
>[danger] ##### replace -- 替換字符
~~~
public class TestStr {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder("hello");
sb1.replace(0, 2, "asdfg");
System.out.println(sb1); // asdfgllo
}
}
~~~
>[danger] ##### reverse -- 字符串反轉
~~~
public class TestStr {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder("hello");
sb1.reverse();
System.out.println(sb1); // olleh
}
}
~~~
>[danger] ##### indexOf/lastIndexOf -- 根據字符串找到對應位置
~~~
public class TestStr {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder("hello");
int l = sb1.indexOf("l");
int ll = sb1.lastIndexOf("l");
System.out.println(l); // 2
System.out.println(ll); // 3
}
}
~~~
>[info] ## 綜合案例
* 將鍵盤錄入的值進行反轉并且轉換為字符串(`StringBuilder`場景反轉)
~~~
import java.util.Scanner;
public class StringTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
StringBuilder strB = new StringBuilder();
str = strB.append(str).reverse().toString();
System.out.print(str);
}
}
~~~
- windows -- 環境變量
- Vscode -- 編寫java
- 初始java
- java -- 關鍵字
- 編寫第一個java程序
- java -- 注釋
- 計算機存儲 -- 進制
- java -- 類型
- java -- 變量
- 數字類型
- 布爾類型
- 字符類型
- 類型轉換
- 雙等比較是什么
- java -- 運算符
- 算數運算符
- 字符串拼接
- 關系/比較運算符
- 自增減運算符
- 邏輯運算符
- 三目運算
- 賦值運算符
- 移位運算符
- 位運算符
- 運算符優先級
- java -- 流程控制語句
- if /else if /if -- 判斷
- switch case分支結構
- for -- 循環
- 用雙重for循環
- while -- 循環
- do while -- 循環
- 案例練習
- java -- 數組
- 數組的存儲
- 數組的增刪改查
- 數組的特點
- 數組案例
- 二維數組
- 數組的工具方法
- java -- 方法
- java -- 方法的重載
- java -- 方法的調用流程
- java -- 類方法傳參注意事項
- java -- 方法練習案例
- 對比 return break continue
- for each循環
- java -- 基礎練習
- java -- 面向對象
- java -- 創建類和對象
- java -- 訪問控制符
- java -- 類成員方法
- java -- 構造方法
- java -- this
- java -- 封裝
- java -- 對象內存圖
- java -- 創建對象案例
- java -- static
- java -- 繼承
- super -- 關鍵字
- java -- 構造塊和靜態代碼塊
- java -- 重寫
- java -- final
- java -- 多態
- java -- 抽象類
- java -- 接口
- 引用類型數據轉換
- 綜合案例
- java -- 內部類
- java -- 回調模式
- java -- 枚舉類型
- java -- switch 使用枚舉
- java -- 枚舉方法使用
- java -- 枚舉類實現接口
- java -- javaBean
- java -- package 包
- java -- import
- java -- 遞歸練習
- java -- 設計模式
- 單例模式
- java -- 注解
- java -- 元注解
- Java -- 核心類庫
- java -- 處理字符串
- Java -- String
- String -- 常用方法
- String -- 正則
- Java -- StringBuilder 和 StringBuffer
- 知識點
- Java -- StringJoiner 字符串拼接
- 練習題
- 字符串的總結
- Java -- 包裝類
- Integer
- Double
- Boolean
- Character
- java -- 集合類
- java -- util.Collection
- Iterator接口
- java -- util.List
- java -- ArrayList
- java -- util.Queue
- java -- util.Set
- java -- util.Map
- java -- util.Collections
- Java -- Math
- Java -- java.lang
- Java -- Object
- Java -- 獲取當前時間戳
- Java -- 異常
- Java -- java.util
- java -- Date
- java -- Calender
- Java -- java.text
- Java -- SimpleDateFormat
- Java -- java.time
- Java -- java.io
- java -- io.File
- java -- 泛型
- IDEA -- 用法