题目描述
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
这道题主要考察了我们队字符串的操作程度与思维逻辑,还考察了我们对String ,StringBuffer , StringBuilder的了解,
解题思路:将字符串转换为字符数组进行操作,遍历字符数组,如果发现是空格,就换成%20即可,废话不多说,代码如下:
public class Replace { public String replace (String str){ String newStr = ""; for (int i = 0; i < str.length(); i++) { if(str.charAt(i) == ' '){ newStr = newStr+"%20"; }else{ newStr = newStr + str.charAt(i); } } return newStr; } public static void main(String[] args) { String a = "Hello World"; System.out.println(a); Replace replace = new Replace(); System.out.println(replace.replace(a)); } }
简单来讲这样做肯定是虽然没问题的,但是仔细观察一下String的特性,就会发现,如果用String来创建的话,当这个String进行改变,都会创建一个新的String对象,当很多String对象不会被调用,闲置的时候就会变成内存中的垃圾,这会对内存造成影响,当垃圾很多的时候就会引起JVM的GC,而引起了GC性能就会大大下降,所以改变String内容的时候,尽可能用StringBuffer或者StringBuilder,因为StringBuffer只是一个对象,所以不会影响性能。
public String replace (String str){ StringBuffer newStr = new StringBuffer(); for(int i = 0 ; i <str.length() ; i ++){ if(str.charAt(i) == ' '){ newStr.append("%20"); }else{ newStr.append(str.charAt(i)); } } return newStr.toString(); }
知道了String的坏处,现在就说一说String ,StringBuffer,StringBuilder的区别,和各自优缺点以及应用场景。
String
先来就讲讲String,坏处刚才已经说过了,如果要改变String的内容,每一次改变就是创建一个String对象的过程,这会产生很多垃圾引起GC导致性能变慢。那么好处是什么呢?好处当然是不改变内容的时候编译很快啦!现在我们举个例子解释为什么很快
String a = “Speed”; 这句话代码在编译的时候是在编译a这个对象。假设现在是一个对象的速度
String b = “Speed”+“high”这句话在编译的时候 也是一个对象,而不是两个,所以快在这里,但是a+b的话就会慢了
StringBuffer
接下来讲一下StringBuffer,StringBuffer是一个容器一样,他起到一个缓冲的作用,可以使用insert(指定位置)和append(添加到缓冲区末尾)来进行添加数据的操作,他同时也是一个线程安全的类,他是可以同步的,同步后使得所有操作就好像串行一样,所以线程安全。
StringBuilder
StringBuilder跟StringBuffer是一样的,唯一的区别就是StringBuilder不保证同步,所以他线程不安全。
一般情况下 String<StringBuffer<StringBuilder;