Java 删除字符串中的一个字符

Java 中字符串(String)是不可变对象,无法直接修改或删除其中的字符,删除字符的核心逻辑是:基于原字符串创建新字符串,排除需要删除的字符。本文结合实际场景,详解 4 种删除字符串中单个字符的方法(删除指定索引、删除指定字符),附完整代码示例和避坑指南。

一、核心前提:字符串不可变性

String 类的底层是不可变的字符数组(final char[] value),所有看似 “修改” 字符串的操作(如删除、替换),本质都是创建新的 String 对象。因此,删除字符的核心是:通过拼接、截取等方式生成不含目标字符的新字符串。

二、常用删除方法(按场景分类)

场景 1:删除指定索引位置的字符(最常用)

方法 1:使用 substring() 拼接(基础方案)

String.substring(int beginIndex) 和 String.substring(int beginIndex, int endIndex) 可截取字符串的指定区间,通过拼接 “索引前的子串 + 索引后的子串” 实现删除。
 
语法说明
 
  • substring(beginIndex):截取从 beginIndex 到末尾的子串。
  • substring(beginIndex, endIndex):截取从 beginIndex(包含)到 endIndex(不包含)的子串。
 
示例代码
 
public class DeleteCharByIndex {
    public static void main(String[] args) {
        String original = "HelloJava";
        int deleteIndex = 5; // 要删除的字符索引(索引从0开始,此处对应 'J')
        
        // 校验索引合法性(避免 StringIndexOutOfBoundsException)
        if (deleteIndex < 0 || deleteIndex >= original.length()) {
            System.out.println("索引越界,无法删除");
            return;
        }
        
        // 拼接:0到deleteIndex的子串 + deleteIndex+1到末尾的子串
        String result = original.substring(0, deleteIndex) + original.substring(deleteIndex + 1);
        
        System.out.println("原字符串:" + original); // 输出:HelloJava
        System.out.println("删除后:" + result);    // 输出:Helloava
    }
}
 

方法 2:使用 StringBuilder/StringBuffer(高效方案)

StringBuilder(非线程安全)和 StringBuffer(线程安全)是可变字符序列,提供 deleteCharAt(int index) 方法直接删除指定索引的字符,效率远高于 substring() 拼接(尤其频繁操作时)。
 
示例代码
  
public class DeleteCharWithStringBuilder {
    public static void main(String[] args) {
        String original = "PythonJava";
        int deleteIndex = 6; // 要删除的索引(对应 'J')
        
        // 1. 转换为 StringBuilder
        StringBuilder sb = new StringBuilder(original);
        
        // 2. 删除指定索引的字符
        sb.deleteCharAt(deleteIndex);
        
        // 3. 转换回 String
        String result = sb.toString();
        
        System.out.println("原字符串:" + original); // 输出:PythonJava
        System.out.println("删除后:" + result);    // 输出:Pythonava
    }
}
 

场景 2:删除指定字符(第一个 / 最后一个 / 所有出现的)

子场景 1:删除第一个出现的指定字符

结合 indexOf()(查找字符首次出现的索引)和 substring()/StringBuilder 实现:
  
public class DeleteFirstChar {
    public static void main(String[] args) {
        String original = "Hello World!";
        char deleteChar = 'l'; // 要删除的字符
        
        // 1. 查找字符首次出现的索引
        int firstIndex = original.indexOf(deleteChar);
        
        if (firstIndex == -1) {
            System.out.println("字符不存在,无需删除");
            return;
        }
        
        // 2. 使用 StringBuilder 删除
        StringBuilder sb = new StringBuilder(original);
        sb.deleteCharAt(firstIndex);
        String result = sb.toString();
        
        System.out.println("原字符串:" + original); // 输出:Hello World!
        System.out.println("删除第一个 'l' 后:" + result); // 输出:Helo World!
    }
}
 

子场景 2:删除最后一个出现的指定字符

结合 lastIndexOf()(查找字符最后一次出现的索引)实现:
  
public class DeleteLastChar {
    public static void main(String[] args) {
        String original = "Hello World!";
        char deleteChar = 'l'; // 要删除的字符
        
        // 1. 查找字符最后一次出现的索引
        int lastIndex = original.lastIndexOf(deleteChar);
        
        if (lastIndex == -1) {
            System.out.println("字符不存在,无需删除");
            return;
        }
        
        // 2. 使用 substring 拼接删除
        String result = original.substring(0, lastIndex) + original.substring(lastIndex + 1);
        
        System.out.println("原字符串:" + original); // 输出:Hello World!
        System.out.println("删除最后一个 'l' 后:" + result); // 输出:Hello Word!
    }
}
 

子场景 3:删除所有指定字符(扩展)

若需删除所有指定字符,可使用 replace() 或 StringBuilder 遍历过滤: 
public class DeleteAllChar {
    public static void main(String[] args) {
        String original = "Hello Java, Hello Python!";
        char deleteChar = 'l'; // 要删除的字符
        
        // 方法 1:replace 替换为空(最简单)
        String result1 = original.replace(String.valueOf(deleteChar), "");
        System.out.println("replace 删除所有 'l':" + result1); // 输出:Heo Java, Heo Python!
        
        // 方法 2:StringBuilder 遍历过滤(更灵活)
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < original.length(); i++) {
            char c = original.charAt(i);
            if (c != deleteChar) { // 保留非目标字符
                sb.append(c);
            }
        }
        String result2 = sb.toString();
        System.out.println("遍历过滤删除所有 'l':" + result2); // 输出:Heo Java, Heo Python!
    }
}
 

场景 3:正则表达式删除(复杂匹配场景)

若需删除 “符合特定规则” 的字符(如数字、特殊符号),可使用 replaceAll() 结合正则表达式:public class DeleteCharWithRegex {
    public static void main(String[] args) {
        String original = "Java123Python456";
        
        // 示例 1:删除所有数字字符
        String result1 = original.replaceAll("\\d", "");
        System.out.println("删除所有数字:" + result1); // 输出:JavaPython
        
        // 示例 2:删除第一个数字字符(正则分组)
        String result2 = original.replaceFirst("\\d", "");
        System.out.println("删除第一个数字:" + result2); // 输出:Java23Python456
        
        // 示例 3:删除指定位置的特殊字符(如删除索引5的字符,正则实现)
        int deleteIndex = 5;
        String result3 = original.replaceAll("(?<=.{" + deleteIndex + "}).", "");
        System.out.println("删除索引5的字符:" + result3); // 输出:Java23Python456(原索引5是'2',删除后为Java3Python456)
    }
}
 

三、关键注意事项(避坑指南)

1. 索引越界问题

删除指定索引字符时,必须校验索引范围(0 ≤ index < 字符串长度),否则抛出 StringIndexOutOfBoundsException
  
// 错误示例:索引越界
String str = "test";
str.substring(0, 5); // 报错:String index out of range: 5

// 正确做法:先校验
if (index >= 0 && index < str.length()) {
    // 执行删除操作
} else {
    System.out.println("索引不合法");
}
 

2. 字符不存在的处理

使用 indexOf()/lastIndexOf() 查找字符时,若返回 -1(字符不存在),需避免执行删除操作,否则可能导致错误:
  
String str = "hello";
int index = str.indexOf('z'); // 返回 -1
// 错误:deleteCharAt(-1) 抛出 IndexOutOfBoundsException
// new StringBuilder(str).deleteCharAt(index);

// 正确做法:先判断
if (index != -1) {
    // 执行删除
}
 

3. 空字符串 / 空白字符串处理

若原字符串为空("")或仅含空白字符,删除操作需提前判断,避免无意义处理: 
String str = "";
if (str.isEmpty() || str.isBlank()) {
    System.out.println("字符串为空,无需删除");
    return;
}
 

4. 性能选择

  • 单次删除操作:substring() 拼接足够简洁,性能无差异。
  • 多次 / 频繁删除操作:优先使用 StringBuilder/StringBuffer(避免创建大量临时 String 对象)。
  • 复杂匹配删除:使用正则表达式 replaceAll()/replaceFirst()

四、方法选择总结

应用场景推荐方法优点缺点
删除指定索引字符(单次) substring() 拼接 代码简洁,无需额外类 多次操作创建临时对象
删除指定索引字符(多次) StringBuilder.deleteCharAt() 高效,可变字符序列 需转换类型
删除第一个 / 最后一个指定字符 indexOf()/lastIndexOf() + 拼接 精准定位,逻辑清晰 需处理字符不存在的情况
删除所有指定字符 replace() 或遍历过滤 简单高效 仅适用于单一字符
复杂规则删除(如数字 / 符号) 正则表达式 replaceAll() 灵活适配复杂场景 正则语法需掌握

五、总结

Java 删除字符串中单个字符的核心是 “创建新字符串排除目标字符”,需根据场景选择方法:
 
  • 基础场景(指定索引):优先 substring() 或 StringBuilder
  • 字符定位场景(第一个 / 最后一个):结合 indexOf()/lastIndexOf()
  • 复杂匹配场景:使用正则表达式。

posted on 2025-12-05 09:50  coding博客  阅读(7)  评论(0)    收藏  举报