創建字符串
字符串字面量 | "Hello" | 高效,常量池復用 | 常見、簡單的字符串創建 |
new 關鍵字 | new String("Hello") | 每次創建新對象,性能開銷較高 | 顯式創建新對象 |
字符數組 | new String(char[]) | 轉換字符數組 | 字符數組轉字符串 |
StringBuilder /StringBuffer | sb.toString() | 可變字符串,高效 | 頻繁修改字符串 |
String.format | String.format() | 動態格式化 | 動態內容和格式輸出 |
String.valueOf | String.valueOf() | 基本類型和對象轉字符串 | 類型轉換 |
String.join | String.join() | 多字符串高效拼接 | 多個字符串拼接 |
concat 方法 | str1.concat(str2) | 簡單拼接 | 簡單場景拼接 |
substring | str.substring(0, 5) | 提取子串 | 提取部分字符串 |
String.intern | str.intern() | 常量池優化內存 | 內存優化 |
字節數組 | new String(byte[]) | 解碼字節數組 | 網絡/文件數據轉換為字符串 |
1.字符串字面量
String str = "Hello";
特點
- 字符串字面量存儲在 字符串常量池 中。
- 如果常量池中已經存在相同的字符串,則不會創建新對象,直接返回池中已有的引用。
適用場景
- 用于創建重復使用的常量字符串
2.使用new關鍵字
String str = new String("Hello");
特點
- 如果字符串常量池沒有"Hello"字面量,會先創建一個,然后每次new都會在堆內存中創建一個新的String對象,內容相同的都會引入字符串常量池中的字面量
- 不推薦直接使用new創建字符串,除非明確需要
適用場景
- 顯式要求在堆內存中創建獨立的字符串對象。
3.字節數組
byte[] bytes = "黃小桃".getBytes();
// byte[] bytes = {72, 101, 108, 108, 111}; // ASCII for "Hello"
String string = new String(bytes);
System.out.println(string);
特點
- 將字節數組解碼為字符串。
- 默認使用平臺的字符集,也可指定字符集(如 UTF-8)。
適用場景
- 從網絡、文件中讀取的字節數據轉換為字符串。
4.字符數組
char[] chars = {'H', 'e', 'l', 'l', 'o'};
String str = new String(chars);
特點
- 將字符數組轉換為字符串。
- 不會將字符數組的內容直接放入常量池,而是在堆中創建一個字符串對象。
適用場景
- 字符數組需要拼接或轉為字符串時
5.使用StringBuilder或StringBuffer
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
String str = sb.toString();
特點
- 適合頻繁修改字符串的場景(如拼接、刪除等操作)。
StringBuilder
非線程安全,StringBuffer
是線程安全的。
適用場景
- 需要高效地構建字符串,避免頻繁創建新對象。
6.使用String.format
String str = String.format("Hello,%s!", "World");System.out.println(str); // Hello,World!
特點
- 支持格式化操作,類似于
printf
的功能。 - 可指定格式控制符(如
%d
,%s
)。
%s引用字符串
%d引用整型
適用場景
- 動態格式化字符串。
7.String.valueOf()轉型
int num = 42;
String str = String.valueOf(num);
特點
- 將基本類型(如
int
,double
)或對象轉為字符串。 - 如果傳入的是
null
,返回"null"
。
適用場景
- 將非字符串的基本類型轉換為字符串。
8.使用String.join()
特點
- Java 8 引入的工具方法,用于高效拼接字符串。
- 可以指定分隔符,拼接多個字符串。
適用場景
- 多個字符串的高效拼接。
9.使用concat方法
String str1 = "Hello";
String str2 = " World";
String str = str1.concat(str2);
特點
- 直接拼接兩個字符串,功能類似于
+
。 - 與
+
不同,concat
只能拼接字符串,不能拼接其他類型。
適用場景
- 簡單的字符串拼接。
10.使用substring
String original = "Hello, World!";
String subStr = original.substring(0, 5); // "Hello"
特點
- 從原字符串提取子串,生成新的字符串。
- 新字符串仍然是不可變的。
適用場景
- 提取部分字符串。
11.使用String.intern()
String str = new String("Hello").intern();
特點
- 將字符串對象放入字符串常量池,如果池中已存在相同內容的字符串,則返回池中的引用。
- 用于減少內存占用。
適用場景
- 手動優化內存使用,減少重復字符串對象。
12.使用Arrays.asList
和String.join
String str = String.join(", ", Arrays.asList("Apple", "Banana", "Cherry"));
特點
- 利用
String.join
和List
數據實現快速拼接。
適用場景
- 列表中的數據拼接為字符串。
字符串基本方法
1.獲取字符串長度
String str = "Hello";
int length = str.length(); // 5
2.獲取字符
String str = "Hello";
char c = str.charAt(1); // 'e'
3.查找子串或字符
String str = "Hello, World!";
int index = str.indexOf("World"); // 7
int lastIndex = str.lastIndexOf('o'); // 8
boolean contains = str.contains("Hello"); // true
4.字符串比較
String str1 = "apple";
String str2 = "banana";boolean isEqual = str1.equals(str2); // false
boolean ignoreCase = str1.equalsIgnoreCase("APPLE"); // true
int compare = str1.compareTo(str2); // 按字典序比較,返回負值表示 str1 < str2
5.判斷前綴或后綴
String str = "hello.java";
boolean startsWith = str.startsWith("hello"); // true
boolean endsWith = str.endsWith(".java"); // true
6.判斷是否為空
String str = "";
boolean isEmpty = str.isEmpty(); // true
7.字符串截取
String str = "Hello, World!";
String subStr1 = str.substring(0, 5); // "Hello"
String subStr2 = str.substring(7); // "World!"
8.字符串替換
String str = "Hello, World!";
String replaced = str.replace("World", "Java"); // "Hello, Java!"
String replacedAll = str.replaceAll("\\s", "_"); // 用正則替換,"Hello,_World!"
9.刪除前后空格
String str = " Hello, World! ";
String trimmed = str.trim(); // "Hello, World!"
10.分割字符串
String str = "Apple,Banana,Cherry";
String[] fruits = str.split(","); // ["Apple", "Banana", "Cherry"]
11.拼接字符串
String joined = String.join("-", "Apple", "Banana", "Cherry"); // "Apple-Banana-Cherry"
12.轉換大小寫
String str = "Hello";
String upper = str.toUpperCase(); // "HELLO"
String lower = str.toLowerCase(); // "hello"
13.轉換為字符數組
String str = "Hello";
char[] chars = str.toCharArray(); // ['H', 'e', 'l', 'l', 'o']
14.轉換為字節數組
String str = "Hello";
byte[] bytes = str.getBytes(); // 按默認編碼轉換
15.格式化字符串
%s引用字符串
%d引用整型
String formatted = String.format("Hello, %s! You have %d messages.", "John", 5);
// 輸出: "Hello, John! You have 5 messages."
16.判斷字符串是否匹配正則
String str = "123abc";
boolean matches = str.matches("\\d+"); // false(因為包含字母)
17.判斷是否為空或僅包含空白字符
String str = " ";
boolean isBlank = str.trim().isEmpty(); // true
18.字符串構建
StringBuilder
是 Java 中推薦的可變字符串操作類。
但是線程不安全,所以多線程環境下最好用StringBuffer
StringBuilder sb = new StringBuilder("Hello");
sb.append(", World!"); // 拼接字符串
sb.insert(5, " Java"); // 插入字符串
sb.delete(5, 10); // 刪除指定范圍的字符
sb.reverse(); // 反轉字符串
System.out.println(sb.toString()); // "!dlroW ,olleH"
19.連續空格替換成單個空格
String str = "Hello World!";
String normalized = str.replaceAll("\\s+", " "); // "Hello World!"
20.保留字符串中的數字
String str = "abc123def456";
String digits = str.replaceAll("\\D", ""); // "123456"
21.替換首尾字符
String str = "123-456-789";
String result = str.replaceFirst("^123", "XXX"); // "XXX-456-789"
22.性能優化-字符串拼接
使用 StringBuilder
代替 +
操作
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++) {sb.append(i).append(", ");
}
System.out.println(sb.toString());
23.使用intern()減少重復字符串
String.intern()
將字符串放入常量池,避免創建重復對象
String str1 = "Hello".intern();
String str2 = new String("Hello").intern();
System.out.println(str1 == str2); // true