Java代码实现替换空格

本文解析如何使用Java实现将字符串中的每个空格替换为%20,通过预分配新字符串并逐个字符写入避免多次后移,提高效率。

剑指Offer-替换空格

题目: 实现一个函数,把字符串中的每一个空格替换为"%20"。
背景: 在URL中存在一些特殊字符,如空格、#等,我们需要把这些特殊字符转换为服务器所能识别的字符,转换的规则为在%后加上ASCII码的两位十六进制的表示。
思路如下

如果每一次发现一个空格就在这个空格的位置插入一个%20的话,考虑不覆盖后边的字符的情况下,就要将后边的进行后移,而如果中间穿插多个空格就会导致部分字符串进行多次后移,这样肯定不是最让人满意的答案。在允许自己分配足够的内存的情况下,因为一个空格替换需要多出来两个长度,则分配一个丁长发的新字符串,再逐次重新写新字符串

public static String replaceSpace(String str){
        if (null == str || str.isEmpty()) return null;

        int le = str.length();

        char[] chars = str.toCharArray();
        //计算空格的数量
        int spaceCount = 0;
        for (char c : chars) {
            if (c == ' '){
                spaceCount ++;
            }
        }
        if (spaceCount == 0) return str;
        int newLe = le+spaceCount*2;
        char[] newChar =  new char[newLe];
        
        int p2 = newLe - 1;

        for (int i = chars.length - 1; i >= 0; i--) {
            if (' ' != chars[i]){
                newChar[p2--] = chars[i];
            }else{
                newChar[p2--] = '0';
                newChar[p2--] = '2';
                newChar[p2--] = '%';
            }
        }
        return new String(newChar);
    }

测试
在这里插入图片描述

<think>我们参考了提供的引用内容,用户需求是查找Java代码实现替换字符串中所有空格的方法。 引用中提供了三种方法: 1. 直接遍历字符串,遇到空格替换为"%20",非空格直接追加(引用1和引用2的第二种方法)。 2. 使用StringBuilder代替字符串拼接提高效率(引用2的第二种方法)。 3. 使用Java自带的replace方法(引用2的第一种方法)。 4. 从后往前移动字符,每个字符只移动一次(引用3),这种方法针对原题是要求在原字符串缓冲区(StringBuffer)上修改,且为了减少移动次数而设计。 考虑到用户的需求仅是替换字符串中所有空格,我们可以提供以下几种常见方法: 方法1:使用String的replaceAll方法 这是最简单直接的方式,利用Java字符串的内置方法。 ```java String original = "Hello World Java"; String replaced = original.replaceAll(" ", "%20"); ``` 方法2:使用String的replace方法(注意:replace可以替换单个字符,也可以替换字符序列) 因为空格是一个字符,所以可以直接用: ```java String original = "Hello World Java"; String replaced = original.replace(' ', "%20"); // 注意:这里第二个参数是字符串,因为替换的内容是字符串 ``` 但是注意:replace方法如果传入的是char和CharSequence,这里第二个参数是字符串(CharSequence),所以可以这样用。但要注意,replace(CharSequence target, CharSequence replacement) 也可以直接使用: ```java String replaced = original.replace(" ", "%20"); ``` 方法3:使用StringBuilder(效率较高,特别是在循环中) 如果需要在循环中处理,或者需要更高的效率(避免创建多个字符串对象),可以使用StringBuilder。 ```java String original = "Hello World Java"; StringBuilder sb = new StringBuilder(); for (int i = 0; i < original.length(); i++) { char c = original.charAt(i); if (c == ' ') { sb.append("%20"); } else { sb.append(c); } } String replaced = sb.toString(); ``` 方法4:针对StringBuffer(如果原始数据是StringBuffer) 如果原始数据是StringBuffer,我们可以使用类似方法3的方式,或者使用引用3中的从后往前移动的方法(但这种方法较为复杂,一般用于有空间限制的情况,如原题要求在原StringBuffer上操作)。 根据用户的问题,他只需要替换字符串中的空格,并没有提到原始数据类型。所以我们可以推荐最简单的方法:使用String的replace方法。 但是需要注意的是,如果替换字符串很长并且空格很多,使用StringBuilder的方式效率会更高。而replace方法内部实际上也是遍历字符串,然后使用StringBuilder来实现的,所以两者性能相近。但代码简洁性上,replace更优。 因此,我们给出以下建议: - 如果追求代码简洁,使用`replace`方法。 - 如果已知字符串很大且空格很多,并且对性能有较高要求,可以使用StringBuilder方式。 示例代码(推荐): ```java public class ReplaceSpace { public static void main(String[] args) { String str = "We are happy."; // 方法1: 使用replace String result1 = str.replace(" ", "%20"); System.out.println(result1); // 方法2: 使用StringBuilder String result2 = replaceSpaceWithStringBuilder(str); System.out.println(result2); } public static String replaceSpaceWithStringBuilder(String str) { if (str == null) { return null; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c == ' ') { sb.append("%20"); } else { sb.append(c); } } return sb.toString(); } } ``` 注意:在引用3中,方法是从后往前移动,但这种方法主要适用于原题要求在原StringBuffer上进行修改,且提供了足够的空间(长度已经扩展)的情况。对于普通的字符串替换,我们不需要这么复杂,因为StringBuffer和StringBuilder都提供了灵活的操作。 因此,对于用户的需求,我们推荐使用最简单的方法:`str.replace(" ", "%20")`。 相关问题: 1. Java替换字符串空格有哪些方法? 2. 为什么在循环中拼接字符串使用StringBuilder更好? 3. 如何处理原字符串很大且需要高效替换的情况? 4. String的replace方法和replaceAll方法有什么区别? 5. 在StringBuffer上直接修改替换空格有什么优势? </think>### Java代码实现替换字符串中所有空格的方法 根据提供的引用内容,Java实现字符串空格替换主要有三种方法,下面详细说明: #### 1. 直接遍历替换(基础方法) ```java public String replaceSpace(String str) { String result = ""; for (int i = 0; i < str.length(); i++) { if (str.charAt(i) == ' ') { result += "%20"; } else { result += str.charAt(i); } } return result; } ``` - **优点**:逻辑简单直观 - **缺点**:频繁字符串拼接效率低(每次`+=`生成新对象) - **适用场景**:短字符串处理[^1] #### 2. 使用`StringBuilder`(推荐方法) ```java public String replaceSpace(String str) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c == ' ') { sb.append("%20"); } else { sb.append(c); } } return sb.toString(); } ``` - **优点**:避免频繁对象创建,时间复杂度$O(n)$,空间效率高 - **推荐场景**:常规字符串处理,性能最优解[^2] #### 3. 使用内置`replace()`方法(最简洁) ```java public String replaceSpace(String str) { return str.replace(" ", "%20"); } ``` - **优点**:代码最简洁,内置方法优化过性能 - **注意**:实际调用了`Pattern.compile()`,适合简单场景[^2] #### 4. 双指针原地修改(进阶方法) ```java public String replaceSpace(StringBuffer str) { // 统计空格数量 int spaceCount = 0; for (int i = 0; i < str.length(); i++) { if (str.charAt(i) == ' ') spaceCount++; } // 设置新长度 int oldLen = str.length(); int newLen = oldLen + 2 * spaceCount; str.setLength(newLen); // 从后向前替换 int oldIndex = oldLen - 1; int newIndex = newLen - 1; while (oldIndex >= 0 && newIndex > oldIndex) { char c = str.charAt(oldIndex); if (c == ' ') { str.setCharAt(newIndex--, '0'); str.setCharAt(newIndex--, '2'); str.setCharAt(newIndex--, '%'); } else { str.setCharAt(newIndex--, c); } oldIndex--; } return str.toString(); } ``` - **优点**:每个字符只移动一次,时间复杂度$O(n)$ - **适用场景**:超大字符串或内存受限环境[^3] --- ### 总结对比 | 方法 | 时间复杂度 | 空间复杂度 | 适用场景 | |--------------------|------------|------------|------------------| | 直接遍历 | $O(n^2)$ | $O(n)$ | 短字符串 | | StringBuilder | $O(n)$ | $O(n)$ | 通用场景(推荐) | | String.replace() | $O(n)$ | $O(n)$ | 简洁实现 | | 双指针原地修改 | $O(n)$ | $O(1)$ | 超大字符串 | **日常使用建议**:优先选择`StringBuilder`或`String.replace()`方法,兼顾性能和代码简洁性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值