替换空格

516 阅读2分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战

题目

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1:

输入: s = "We are happy."
输出: "We%20are%20happy."

限制:

0 <= s 的长度 <= 10000

题目分析

这道题目是对字符串的操作,操作还是比较简单的,遍历列表s的每个字符,然后判断,如果是是空格添加%20,不是空格添加原来的字符。

代码实现

class Solution {
    public String replaceSpace(String s) {
        StringBuilder result = new StringBuilder();
        for (Character c: s.toCharArray()) {
            if (c==' ') {
                result.append("%20");
            }else {
                result.append(c);
            }
        }
        return  result.toString();
    }
}

这里利用了StringBuilder来构建字符串,这里说一下StringBuffer和StringBuilder,这两个都继承AbstractStringBuilder,StringBuffer是线程安全的,StringBuilder是线程不安全的

StringBuffer线程安全是因为有synchronized关键字修饰

@Override
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}

StringBuilder线程不安全

@Override
public StringBuilder append(String str) {
    super.append(str);
    return this;
}

StringBuffer被synchronized修饰,所以在性能方面肯定没有StringBuilder好

下面这一下这两个类的toString()方法

StringBuffer


private transient char[] toStringCache;

@Override
public synchronized String toString() {
    if (toStringCache == null) {
        toStringCache = Arrays.copyOfRange(value, 0, count);
    }
    return new String(toStringCache, true);
}

StringBuilder

@Override
public String toString() {
    // Create a copy, don't share the array
    return new String(value, 0, count);
}

StringBuffer中有一个toStringCache数组,toStringCache数组是一个缓冲区,在使用toString方法的时候直接从缓冲区中拿到字符串

而StringBuilder每次复制一次字符数组,从而构造字符串。

这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉字符串的操作。

这篇文章主要是对字符串的一个替换功能的实现,然后通过源码分析了一下StringBuffer和StringBuilder的区别,通过源码我们才能懂得里面的原理。

如果有不当之处,欢迎指正。