String、StringBuilder、StringBuffer

  从一开始学java时就知道如果要String是常量,StringBuilder和StringBuffer是变量,如果需要对一个字符串进行拼凑,一般都用后两者,并且也知道String的“+”其实是会新建对象的,除此之外还知道StringBuffer是安全的。但是最近在项目中,几乎在字符串的拼凑上都是采用StringBuilder。

  刚看了一篇文章,写得很清晰,很简单https://www.cnblogs.com/su-feng/p/6659064.html,我这里为了加深影响,便引用过来。

关于速度

  StringBuilder > StringBuffer > String

  
  这里只说关于String慢的原因,我就直接引用博主所给

String str="abc";
System.out.println(str);
str=str+"de";
System.out.println(str);

  这段代码表面上看似乎我们修改了str这个变量,但是事实上并不是,JVM在处理这段代码时在第3行中,JVM会新建一个对象str,并将之前的str值加上"de"之后赋值给它,并将之前的str值“abc”回收。

  如果我们对字符串不断的拼凑,JVM就会不断的回收、新建,这会涉及到地址的分配等等一些列操作,这就是之所以其速度慢的原因。

  

关于安全

 

  一直都在吼什么StringBuilder是不安全的,我之前是这样记的,builder嘛,建筑者,搞建筑需要戴安全帽,因为不安全(似乎很傻),但是Builder为什么不安全呢,SrtingBuffer就是安全的呢,博主给的解释很好:

  如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

  

总结

  依旧引用博主

  String:适用于少量的字符串操作的情况
  StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
  StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

 

 

posted @ 2018-03-16 11:02  小小范同学  阅读(165)  评论(0编辑  收藏  举报