正好做到了一道算法题,如题请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
传入的参数为stringbuffer,我当时想的答案就是return str.toString().replaceAll(" ", "%20"),但是看别的答案有用stringbuilder的,我就去翻了一下string,stringbuffer,stringbuilder的区别。
首先:
string对象是不可变的,string类中每一个修改string值的方法,实际上都是创建了一个全新的string对象,以包含修改后的
字符串内容,而最初的string则丝毫未动。所以使用string对象来字符串进行增删改是很耗费内存和性能的。
我们来看一下一句简单的代码。String mango="mango";String s="abc"+“mango”+"def"+47;那这一段代码是怎么工作的呢?上一篇的博客我总结了一下string类常用的方法,其中就有一个append方法,所以是不是编译器用了append来完成的?答案为不是。编译器自动引入了java.lang.stringbuilder类。虽然我们在写代码时候并没有去引用它,但编译器自动的引用了他,因为他更高效。编译器创建了一个stringbuilder对象,并为每个字符串调用stringbuilder的append方法。共计四次,最后调用tostring()方法生成结果。下面来具体介绍这三个不同对象的特点。
1.string在修改时候不会改变对象自身
上文已经讲过,对string类型进行改变等同于生成了一个新的string对象,然后指向新的string对象地址,所以改变内容的字符串最好不要用string对象
String str="wujie";//地址1
str="shuaige";//地址2
2。stringbuffer在修改时候会改变自身对象,地址不变
stringbuffer的append,insert,deletecharat,reverse等方法都是对自身进行操作,而不是生成新的对象。
3.stringbuilder在修改时候会改变自身对象,地址不变,但他对字符串的操作比stringbuffer更加快。
4.stringbuffer是线程安全的,所以开销更大,这也是他操作字符串比stringbuilder慢的原因。但是它更加安全。
而stringbuilder是线程不安全的。
总结:
- 如果操作很少量数据可以用string。
- 多线程操作字符串缓冲区下操作大量数据用stringbuffer
- 单线程操作字符串缓冲区下操作大量数据用stringbuilder。