一、StringBuffer和String类的一些重要区别:
1、String类是final类,不可被继承。Stringbuffer类也是final类,不可被继承,继承了AbstractStringBuilder类。
2、StringBuffer构建的字符串的效率较高,因为StringBuffer类存储数据是用父类的char[] 类型的数组,关键是这个数组不是final类型,
因此是放在堆里的,而不是放到常量池里,因此只有当堆里的容量不够时才会新开辟更大的空间,再将原来的数据拷贝到新空间,然后数据的地址才指向新开的空间(这样子才更新地址);
再看下String类里存储数据的char[]类型:
这里是final来修饰的,因此这里的数据应该是放到常量池里,然后每次更新String类型的数据(比如str += "str"之类的操作 ),就相当于在常量池里新开辟空间存放新的数据,更新其地址。
因此每次更新存储的数据时,String类型的更新可能更加繁琐,既要开新空间,又要将原来数据和新添加的数据拷贝到新的空间,然后再更新地址。所以效率比StringBuffer慢些。
2、默认StringBuffer的扩容机制:一开始构造器没有参数时是默认可以存16个字符的:
如果构造器有字符串参数则如下:
,都是直接看源码即可,没什么吊的东西。
二、StringBuffer类和StringBuilder类的一些重要区别
1、两者的类图:
StringBuilder类可以说是StringBuffer类的翻版吧,很多都是类似的。
2、StringBuffer类和StringBuilder类很多操作基本相同的,包括扩容机制、添加数据的方式,
唯一较大的差别是StringBuffer类型数据的很多操作很多是线程安全的,而StringBuilder类型数据是线程不安全
浅浅看一下源码:
看吧,这里很多方法有synchronized修饰,所以说StringBuffer类型数据在被操作时,加了一层线程安全保护的操作。
而StringBuilder类则没有:
这么看来,在单线程操作下,StringBuilder类的操作数据的效率应该比StringBuffer高,因为StringBuffer类型数据被加了一次线程控制的保护操作了嘛。
所以说,一般StringBuilder、StringBuffer和String类型数据的操作效率是:
StringBuilder>StringBuffer>String