Skip to content

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); // 反向拼接

重要注意事项

  1. 不可变性:每次修改都生成新对象,高频修改用StringBuilder(非线程安全)或StringBuffer(线程安全)
  2. 相等比较
    java
    String a = "hi";
    String b = new String("hi");
    a.equals(b);  // true(内容相等)
    a == b;       // false(对象引用不同)
  3. 内存优化:字面量存储在字符串常量池new String()强制创建新对象
  4. 正则性能split()replaceAll()用正则表达式,复杂匹配可能影响性能
  5. 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("\\.")