在前面的文章中,我们已经分别介绍了String、StringBuffer、StringBuilder三者的基本使用,还不懂String、StringBuffer、StringBuilder这三个类是如何使用的,可以先去看看之前的文章:Java:String类的使用。
本文主要是介绍String、StringBuffer、StringBuilder之间的区别。
在前面的文章中,我们知道了String是具有不可变性的,由此我们就引出了可变性的StringBuffer类和StringBuilder类。
实际上,这三者在我们日常写代码的过程中都是会经常使用到的,那么既然其他两个类都是可变的,为什么我们还要使用String类呢?直接全部使用其他两个类不好吗?感觉使用String类有这么多的局限性,不可变对象到底有什么好处呢?
对于这种种的疑问,其实总结出来就是:为什么String要设计成不可变的?
原因有三:
- 方便实现字符串对象池,如果String可变,那么对象池就需要考虑写时拷贝的问题
- 不可变对象是线程安全的
- 不可变对象更方便缓存hashcode,作为key时可以更高效率地保存到HashMap中
那么对于StringBuffer类和StringBuilder类,他们是可以进行修改的,实际上他们的大部分功能也都是相同的,其中,最主要的区别就是:StringBuffer采用了同步处理,属于线程安全的操作;而StringBuilder并未采用同步处理,因此是属于线程不安全操作,这也是这两个类之间最大的区别点(关于线程安全但是知识点到后面学习到了在做解释)。
这时候可能有人会说:StringBuffer既是可修改的,又是线程安全的,那还要String类和StringBuilder类干嘛呢?之间全部使用StringBuffer不就行了吗?
其实String和StringBuilder中有一些其他东西是StringBuffer说不具备的,往往这些都是要通过代码的具体实现来决定的,不能一棒子打死说全部都使用StringBuffer,很显然是不恰当的,String在Java源码中出现的地方比比皆是,只能够说,在实现中写代码比较经常使用的是StringBuffer。