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:适用多线程下在字符缓冲区进行大量操作的情况