在 Java 中,String
类是用于表示不可变字符序列的核心类,提供了丰富的 API 用于操作字符串。以下是 String
类的关键特性和常用方法详解:
一、String 的核心特性
-
不可变性(Immutable)
-
一旦创建,字符串内容不可修改。所有修改操作(如拼接、替换)都会生成新字符串。
-
优势:线程安全、缓存哈希值、复用字符串常量池。
-
示例:
javaString s1 = "Hello"; String s2 = s1.concat(" World"); // s1 不变,s2 是新对象 "Hello World"
-
-
字符串常量池(String Pool)
-
直接使用双引号创建的字符串会被存入常量池,重复的字符串字面量会复用对象。
-
new String("...")
会强制在堆中创建新对象,即使内容相同。 -
示例:
javaString a = "Java"; // 常量池中的对象 String b = "Java"; // 复用常量池的对象(a == b 为 true) String c = new String("Java"); // 堆中新对象(a == c 为 false)
-
二、String 的构造方法
构造方法 | 描述 |
---|---|
String() |
创建空字符串对象 |
String(String original) |
基于现有字符串创建新对象(内容相同,但对象不同) |
String(char[] value) |
通过字符数组创建字符串 |
String(byte[] bytes, Charset charset) |
通过字节数组和指定编码创建字符串 |
String(StringBuffer buffer) |
通过 StringBuffer 创建字符串 |
String(StringBuilder builder) |
通过 StringBuilder 创建字符串 |
示例:
java
char[] chars = {'H', 'e', 'l', 'l', 'o'};
String s1 = new String(chars); // "Hello"
byte[] bytes = {72, 101, 108, 108, 111};
String s2 = new String(bytes, StandardCharsets.UTF_8); // "Hello"
三、String 的常用 API
1. 字符串基本信息
方法 | 描述 | 示例 |
---|---|---|
int length() |
返回字符串长度 | "Java".length() → 4 |
boolean isEmpty() |
判断字符串是否为空(长度为0) | "".isEmpty() → true |
boolean isBlank() |
判断字符串是否全为空白(Java 11+) | " ".isBlank() → true |
2. 字符串操作
方法 | 描述 | 示例 |
---|---|---|
String concat(String str) |
拼接字符串,返回新字符串 | "Hello".concat("!") → "Hello!" |
String substring(int beginIndex) |
截取从 beginIndex 到末尾的子串 |
"Java".substring(1) → "ava" |
String substring(int begin, int end) |
截取 [begin, end) 的子串 |
"Java".substring(1, 3) → "av" |
String replace(char old, char new) |
替换所有匹配字符 | "Java".replace('a', 'o') → "Jovo" |
String replaceAll(String regex, String replacement) |
使用正则替换所有匹配的子串 | "a1b2".replaceAll("\\d", "-") → "a-b-" |
String[] split(String regex) |
按正则分割字符串为数组 | "a,b,c".split(",") → ["a", "b", "c"] |
String toLowerCase() |
转为小写 | "JAVA".toLowerCase() → "java" |
String toUpperCase() |
转为大写 | "java".toUpperCase() → "JAVA" |
String trim() |
去除首尾空白符(ASCII空格、制表符等) | " Java ".trim() → "Java" |
String strip() |
去除首尾空白符(支持全角空格,Java 11+) | " Java ".strip() → "Java" |
3. 字符串比较
方法 | 描述 | 示例 |
---|---|---|
boolean equals(Object obj) |
比较内容是否相等(区分大小写) | "Java".equals("java") → false |
boolean equalsIgnoreCase(String str) |
比较内容是否相等(不区分大小写) | "Java".equalsIgnoreCase("JAVA") → true |
int compareTo(String str) |
按字典序比较大小(返回负数、0、正数) | "a".compareTo("b") → -1 |
int compareToIgnoreCase(String str) |
按字典序比较大小(忽略大小写) | "A".compareToIgnoreCase("a") → 0 |
4. 字符串查找
方法 | 描述 | 示例 |
---|---|---|
boolean contains(CharSequence s) |
是否包含指定子串 | "Java".contains("av") → true |
int indexOf(int ch) |
返回字符首次出现的索引(未找到返回-1) | "Java".indexOf('a') → 1 |
int indexOf(String str) |
返回子串首次出现的索引 | "Java".indexOf("va") → 2 |
int lastIndexOf(int ch) |
返回字符最后一次出现的索引 | "Java".lastIndexOf('a') → 3 |
boolean startsWith(String prefix) |
是否以指定前缀开头 | "Java".startsWith("Ja") → true |
boolean endsWith(String suffix) |
是否以指定后缀结尾 | "Java".endsWith("va") → false |
5. 类型转换
方法 | 描述 | 示例 |
---|---|---|
char[] toCharArray() |
转为字符数组 | "Java".toCharArray() → ['J','a','v','a'] |
byte[] getBytes() |
转为默认编码的字节数组 | "Java".getBytes() → [74, 97, 118, 97] |
byte[] getBytes(Charset charset) |
转为指定编码的字节数组 | "Java".getBytes(StandardCharsets.UTF_8) |
static String valueOf(Object obj) |
将对象转为字符串(调用 obj.toString() ) |
String.valueOf(123) → "123" |
四、注意事项
-
字符串比较必须用
equals
,而非==
javaString s1 = new String("Java"); String s2 = new String("Java"); System.out.println(s1 == s2); // false(比较对象地址) System.out.println(s1.equals(s2)); // true(比较内容)
-
避免频繁拼接字符串
使用
+
或concat
拼接字符串会生成大量中间对象,应改用StringBuilder
:javaStringBuilder sb = new StringBuilder(); sb.append("Hello").append(" ").append("World"); String result = sb.toString(); // "Hello World"
-
处理空指针(Null Safety)
在调用字符串方法前检查是否为
null
:javaString str = null; if (str != null && !str.isEmpty()) { // 安全操作 }
五、示例代码
java
public class StringDemo {
public static void main(String[] args) {
String s = " Hello, Java! ";
// 基本操作
System.out.println(s.trim()); // "Hello, Java!"
System.out.println(s.substring(7)); // "Java! "
System.out.println(s.replace("Java", "World")); // " Hello, World! "
// 比较
System.out.println("java".equalsIgnoreCase("JAVA")); // true
// 分割与拼接
String[] parts = "a,b,c".split(",");
String joined = String.join("-", parts); // "a-b-c"
System.out.println(joined);
}
}
六、Java 11+ 新增方法
方法 | 描述 | 示例 |
---|---|---|
String repeat(int n) |
重复字符串 n 次 | "a".repeat(3) → "aaa" |
String stripLeading() |
去除头部空白符(支持全角空格) | " Java".stripLeading() → "Java" |
String stripTrailing() |
去除尾部空白符(支持全角空格) | "Java ".stripTrailing() → "Java" |
boolean isBlank() |
判断是否全为空白符(包括全角空格) | " ".isBlank() → true |
掌握这些 API 能高效处理字符串操作,注意合理选择方法以优化性能!