string,stringbuffer,stringbuilder的区别

正好做到了一道算法题,如题请实现一个函数,将一个字符串中的空格替换成“%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是线程不安全的。

总结:

  1. 如果操作很少量数据可以用string。
  2. 多线程操作字符串缓冲区下操作大量数据用stringbuffer
  3. 单线程操作字符串缓冲区下操作大量数据用stringbuilder。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值