String、StringBuffer、StringBuilder的区别和关系
String
声明后是一个常量,而Stringbuffer
和StringBuilder
是数据结构是变量,所以比String在连接字符时效率高。
并且StringBuffer和StringBuilder的区别是StringBuffer是线程安全的(synchronized) ,而StringBuilder是非线程安全的,所以速度大致排行为:StringBuilder>StringBuffer>String
以上只是基于印象或者说是死记硬背的东西,没有看源码是否真的是这样的。下面就来看看String,StringBuilder,StringBuffer的源码来真正的记住。
String
String中的concat方法实现了字符串的拼接。
实例变量
String类中有两个实例变量,分别为value和hash
1 | /** The value is used for character storage. */ |
构造方法
String的构造方法很多,但是都比较简单,下面来说比较常用的几种。
1 | // 当新建一个String对象的时候,会默认付一个空的字符序列,请注意,由于字符串是不可变的,因此不必使用此构造函数 |
concat方法
为什么说String的效率低,就体现在concat拼接字符串的时候每次都要返回一个新的String对象。
1 | public String concat(String str) { |
StringBuilder
StringBuilder继承了AbstractStringBuilder,其中的实例变量和String中的基本相同,
构造方法
1 | public StringBuilder(int capacity) { |
append方法
可以看到,并没有新建对象,只是在改变对象中的内容。
1 | public StringBuilder append(String str) { |
StringBuffer
和StringBuilder一样,也是继承了AbstractStringBuilder类,但是看一个append这个方法的源码就能够知道有什么区别了
append方法
添加了synchronized关键字,使得变为线程安全的,但是代价就是效率不如StringBuilder高。
1 |
|