一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
题目:请实现一个函数,将字符串s中的每个空格替换成%20。
示例:
输入:s = "We are happy."
输出:"We%20are%20happy."
解题思路
在做本题之前,首先应该了解在Java中是存在这样的函数的,可以直接将字符串中的对应元素进行替换,例如:
public String replaceSpace2(String s){
return s.replace(" ", "%20");
}
而本题的目的就是让我们自己实现一个类似这种功能的函数,其实思路也很简单,无非就是遍历字符串,遍历到一个替换一个,返回最终的结果即可,如下代码:
public String replaceSpace(String s){
StringBuilder sb = new StringBuilder();
for(int i=0;i<s.length();i++){
if(s.charAt(i) == ' '){
sb.append("%20");
}else {
sb.append(s.charAt(i));
}
}
return sb.toString();
}
时间复杂度为。但上述使用replace最终耗时0ms,而使用replaceAll最终耗时2ms。原因就是replaceAll有一个正则匹配的过程。
Java源码分析
做题不应该局限于此,何况还是这么简单的一题,我们接下来来分析一下在Java中对应的函数是如何实现的!
Java中可以实现此结果的函数有replace和replaceAll。
其中在Java11中,replace的思路和我们上面的思路是一样的,都是通过找到匹配字符串的索引之后进行替换执行stringBuilder的append。
而replaceALL的源码为:
public String replaceAll(String regex, String replacement) {
return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}
可以发现其调用了 Matcher.replaceAll() 方法,具体代码就不贴了,replaceAll在执行的时候首先会判断待匹配的字符串是否是正则表达式,如果是的话则执行正则表达式的替换,否则就是普通字符串的替换,之后也是用StringBuilder追加字符串。
当然如果我们想用replaceAll但字符串中包含正则表达式字符,我们首先需要对其使用\\转义,之后就可以像字符串一样替换了。
本篇写的可能有问题,欢迎指正。