剑指offer第二题,替换字符串中的空格(String,StringBuffer,StringBuilder区别)

时间限制:1秒  空间限制:32768K  热度指数:539500
本题知识点:  字符串
代码语言:JAVA

题目描述

请实现一个函数,将一个字符串中的空格替换成“%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;

猜你喜欢

转载自blog.csdn.net/qq_40033365/article/details/79826960
今日推荐