每过一段时间,当需要做字符串拼接的时候,总是有那么一瞬的犹豫,我要用StringBuffer还是StringBuilder呢。有这个犹豫是因为它们之中有一个是线程安全另外一个是非线程安全的,但是哪一个就不太记得了。这个时候我一般都在idea中分别敲出StringBuffer、StringBuilder然后Ctrl+点击进去看源码,可以看到StringBuffer的方法是有synchronized修饰的,得以确认它就是线程安全的,如下图
但作为一个基础点,当别人问起你呢,总不能再去看一下源码吧。所以需要一个小技巧,从字面意思来看,StringBuilder中的Builder单纯英文翻译是什么意思,是的,“建筑工人”,一想到这个我脑海中就会浮现高楼、吊机、大卡车之类,就觉很危险的,是不安全的,所以StringBuilder不是线程安全的。那另外一个StringBuffer就是线程安全的啦。(v关注:加油小伙,我们一起让编程更加通俗易懂,让生活更有趣吧)
在编程中,用得最多的还是String,它用于少量的字符串操作。由于String是字符串常量,它底层存储使用的字符数组用了final修饰,所以拼接、截取操作都会生成一个新的String对象,性能也是最差的。
StringBuffer和StringBuilder的存储则是创建了一个字符串缓冲区,如果超出了已有的长度才会进行扩容。在进行大量的字符串操作场景中,比如多条件的sql拼接(如下图),就要使用StringBuffer或者StringBuilder了。但实际当中极少用到字符串拼接需要线程安全的场景,所以一般使用StringBuilder就可以了。
总之,效率上来说,StringBuilder>StringBuffer>String
但要注意的是当使用String的“hello”+”word”时,编译器会直接优化为”helloword”。而且String使用加号连接符运算时,jdk1.5开始也会隐式改写成StringBuilder了,所以不见得String的性能就比其它差。()
如果觉得文章对你有帮助,欢迎微信关注【白话Java】,一个致力于让编程更加通俗易懂的地方
回复“8080”收获福利