String类常用方法及代码题应用指南
一、String类是什么?
String是Java中表示不可变字符序列的类(位于java.lang
包)。所有修改操作(如拼接、替换)都会生成新对象而非修改原对象。JDK9后底层改用byte[]
存储,优化了内存占用。
二、常用方法分类(解决什么问题)
类别 | 方法签名 | 功能描述 | 新特性版本 |
---|---|---|---|
基础操作 | int length() | 返回字符串长度 | - |
boolean isEmpty() | 判断是否空字符串 | - | |
char charAt(int index) | 获取指定索引字符 | - | |
比较 | boolean equals(Object obj) | 内容比较(区分大小写) | - |
boolean equalsIgnoreCase(String str) | 内容比较(不区分大小写) | - | |
int compareTo(String str) | 按字典顺序比较大小 | - | |
查找 | int indexOf(int ch) | 返回字符首次出现索引 | - |
int lastIndexOf(String str) | 返回子串末次出现索引 | - | |
boolean contains(CharSequence s) | 判断是否包含子串 | - | |
boolean startsWith(String prefix) | 判断是否以指定前缀开头 | - | |
截取 | String substring(int beginIndex) | 截取从beginIndex到末尾 | - |
String substring(int beginIndex, int endIndex) | 截取[beginIndex, endIndex)区间 | - | |
转换 | String toLowerCase() | 转小写 | - |
String toUpperCase() | 转大写 | - | |
char[] toCharArray() | 转为字符数组 | - | |
static String valueOf(int i) | 基本类型转字符串 | - | |
空白处理 | String trim() | 去除两端ASCII空格 | - |
boolean isBlank() | 检查是否空白(含Unicode空格) | JDK11 | |
String strip() | 去除两端Unicode空格 | JDK11 | |
替换 | String replace(char oldChar, char newChar) | 字符替换 | - |
String replaceAll(String regex, String replacement) | 正则替换所有匹配项 | - | |
分割 | String[] split(String regex) | 按正则分割字符串 | - |
拼接 | String concat(String str) | 字符串拼接 | - |
static String join(CharSequence delimiter, CharSequence... elements) | 用分隔符连接多个字符串 | JDK8 | |
格式化 | static String format(String format, Object... args) | 格式化字符串(类似C的printf) | - |
代码题常用场景及解法
场景1:字符串反转
java
// 方法1:StringBuilder.reverse()
String reversed = new StringBuilder("hello").reverse().toString(); // "olleh"
// 方法2:字符数组双指针交换
char[] chars = str.toCharArray();
int left = 0, right = chars.length-1;
while (left < right) {
char temp = chars[left];
chars[left++] = chars[right];
chars[right--] = temp;
}
return new String(chars);
场景2:检查回文串
java
// 忽略大小写和空格(JDK11新方法)
String clean = "A man, a plan, a canal: Panama"
.replaceAll("[^a-zA-Z0-9]", "") // 去除非字母数字
.toLowerCase();
boolean isPalindrome = new StringBuilder(clean).reverse().toString().equals(clean);
场景3:最长公共前缀
java
// 纵向扫描字符
String[] strs = {"flower","flow","flight"};
for (int i = 0; i < strs[0].length(); i++) {
char c = strs[0].charAt(i);
for (int j = 1; j < strs.length; j++) {
if (i == strs[j].length() || strs[j].charAt(i) != c) {
return strs[0].substring(0, i); // 关键substring
}
}
}
场景4:字符串分割统计
java
// 分割单词并计数(JDK8+)
String text = "apple banana apple orange";
long count = Arrays.stream(text.split("\\s+"))
.filter(word -> word.equals("apple"))
.count(); // 2
场景5:路径处理
java
// 分割路径并重组
String path = "/home/user/../doc/./file.txt";
String[] parts = path.split("/");
Deque<String> stack = new ArrayDeque<>();
for (String p : parts) {
if (p.equals("..")) stack.pop(); // 关键:栈处理层级
else if (!p.equals(".") && !p.isEmpty()) stack.push(p);
}
String normalized = "/" + String.join("/", stack); // 反向拼接
重要注意事项
- 不可变性:每次修改都生成新对象,高频修改用
StringBuilder
(非线程安全)或StringBuffer
(线程安全) - 相等比较:java
String a = "hi"; String b = new String("hi"); a.equals(b); // true(内容相等) a == b; // false(对象引用不同)
- 内存优化:字面量存储在字符串常量池,
new String()
强制创建新对象 - 正则性能:
split()
和replaceAll()
用正则表达式,复杂匹配可能影响性能 - JDK11空白处理:java
" \u3000hello\u2003 ".trim().length(); // 7 (无法去除Unicode空白) " \u3000hello\u2003 ".strip().length(); // 5 (JDK11推荐)
总结
操作类型 | 高频方法 | 代码题应用场景 |
---|---|---|
基础操作 | length() , charAt() | 字符遍历、边界检查 |
比较查找 | equals() , indexOf() | 匹配、子串定位 |
截取转换 | substring() , toCharArray() | 子问题处理、类型转换 |
分割拼接 | split() , join() (JDK8) | 文本解析、路径处理 |
高级处理 | strip() , isBlank() (JDK11) | 输入清洗、空白校验 |
编程技巧:优先用
StringBuilder
做复杂修改;处理Unicode空白用JDK11+新方法;正则表达式注意特殊字符转义(如split("\\.")
)