java中String,StringBuffer,StringBuilder的区别
我们简单了解下这三种数据结构。
String:字符串常量(线程安全)
StringBuffer:字符串变量(线程安全)
StringBuilder:字符串变量(线程不安全)
这里string是字符串常量,我们单个讨论。我们来看看两种声明字符串的方式。
这两种数据虽然相同,但是调用==判断的时候却不相同。因为String a="123"的时候,直接在编译的时候就确定好了字符
串的值。123存储在方法区的常量池中。而String b=new String("123")是在运行的时候在堆区开辟了空间,存储了字符串
123。如果我们添加语句b="100"。这时候是在堆区重新new了个空间,重新赋值。我们来看看String类的源码。
string是由char[]组成的。当改变字符串的时候是在堆区重新申请地址然后赋值。
每次改变string的值的时候都是在新的地址上写入。所以是线程安全的。
stringBuffer是字符串变量,先来看下实现源码:
当改变Stringbuffert的值的时候是调用父类的append函数,对字符串进行改变。而且用了synchronized修饰,当多个线
程对StringBuffer的值进行操作的时候,是线程安全的。
StringBuilder也是字符串变量,实现源码:
当改变StringBuilder的值的时候是调用父类的append函数,但是没有用synchronized关键字修饰,所以线程不安全。
在对字符串改变的性能来说,StringBuilder的性能比StringBuffer稍高一些。但是性能差别不大。尤其是字符串长度较
长的时候,性能差别更小。