String、StringBuffer和StringBuilder的区别
概述
三者都是引用类型,都是对字符串进行操作的类。
不同点:
1 值是否可变
String类是被final修饰的,其底层是字符数组,类不可被继承,值从开始创建到销毁也不可变,若要改变只能通过引用改变达到值改变的效果;StringBuffer和StringBuilder是AbstractStringBuilder的子类,AbstractStringBuilder类底层也是使用字符数组存储字符串,但其没有被final修饰,所以其可继承,StringBuilder和StringBuffer对象的值可以通过append()、insert()、reverse()等方法实现对值的改变。
2 对象创建
String可以通过字符串拼接或者new String() 一个对象,前者回先判断字符串常量池中是否有该值,有的话直接引用,没的话在字符串常量池中创建一个,而后者则是会在堆内存中新建一个对象,与此同时,若是字符串常量池中没有相同字符串,也会在常量池中新建一个;StringBuffer和StringBuilder则是AbstractStringBuilder的子类,直接通过new在堆内存中创建对象。
StringBuilder和StringBuffer可通过toString()方法将对象转换为String对象。
3 线程安全性
String相当于常量,其线程是安全的;StringBuffer实现了synchronized封装,也是线程安全的;而StringBuilder是线程不安全的。
4 效率
StringBuilder未考虑锁的开销,只要不出现频繁创建StringBuilder对象的情况,其效率是很快的;StringBuffer考虑了同步锁,其线程安全,但是比StringBuilder效率略低;所以效率上:StringBuilder>StringBuffer>String。
5 使用场景
StringBuilder线程不安全但是效率高,所以在单线程操作下使用更好;由于StringBuilder在相同情况西效率仅比StringBuffer高了10%~15%左右,但在多线程的情况下却带来了线程不安全的风险,所以在多线程并发下更多地使用StringBuffer。