java中String,StringBuffer,StringBuilder的区别

                            java中String,StringBuffer,StringBuilder的区别

我们简单了解下这三种数据结构。

String:字符串常量(线程安全)

StringBuffer:字符串变量(线程安全)

StringBuilder:字符串变量(线程不安全)

这里string是字符串常量,我们单个讨论。我们来看看两种声明字符串的方式。

这两种数据虽然相同,但是调用==判断的时候却不相同。因为String a="123"的时候,直接在编译的时候就确定好了字符

串的值。123存储在方法区的常量池中。而String b=new String("123")是在运行的时候在堆区开辟了空间,存储了字符串

123。如果我们添加语句b="100"。这时候是在堆区重新new了个空间,重新赋值。我们来看看String类的源码。

java中String,StringBuffer,StringBuilder的区别_第1张图片

java中String,StringBuffer,StringBuilder的区别_第2张图片

string是由char[]组成的。当改变字符串的时候是在堆区重新申请地址然后赋值。

每次改变string的值的时候都是在新的地址上写入。所以是线程安全的。

stringBuffer是字符串变量,先来看下实现源码:

java中String,StringBuffer,StringBuilder的区别_第3张图片

java中String,StringBuffer,StringBuilder的区别_第4张图片

当改变Stringbuffert的值的时候是调用父类的append函数,对字符串进行改变。而且用了synchronized修饰,当多个线

程对StringBuffer的值进行操作的时候,是线程安全的。

StringBuilder也是字符串变量,实现源码:

java中String,StringBuffer,StringBuilder的区别_第5张图片

java中String,StringBuffer,StringBuilder的区别_第6张图片

当改变StringBuilder的值的时候是调用父类的append函数,但是没有用synchronized关键字修饰,所以线程不安全。

在对字符串改变的性能来说,StringBuilder的性能比StringBuffer稍高一些。但是性能差别不大。尤其是字符串长度较

长的时候,性能差别更小。

你可能感兴趣的:(Java)