java中String,Stringbuilder,Stringbuffer的区别

字符类型是java中比较经常使用的基本类型,使用场景非常广泛。

 String常量,StringBuilder,StringBuffer是理论上的一种变量

1、执行速度:

String<StringBuffer<StringBuilder

 原因:

String在java中是不可修改的(String的字符是常量,被写入了内存,如果常量集中找不到该字符串,jvm会重新创建一个新的内存对象并且返回),使用拼接运算+或者重新赋值都是JVM重新在字符集中进行查询(查找是非常耗时的)并新建一个新的对象返回给变量;

StringBuilder内置长度为13的字符数组,append等操作是在内置的对象中写入字符,长度大于13的时候再扩展字符数组的长度。在内存执行的效率上,写入总比查找快点吧(个人理解)。

StringBuffer的实现和上面类似,因为Stringbuffer和Stringbuilder都是AbstractStringBuilder的子类,区别的是Stringbuffer在继承之后重写了synchronized方法。

2.线程安全性

String和Stringbuffer是线程安全的,Stringbuilder是线程不安全的

线程安全:不是说他的一系列操作是同步的 只是对于他执行某个方法的时候不允许别的线程去改变。针对一个类来说是不是线程安全就要看,多个线程在同时在运行,这些线程可能会同时执行某个方法。但是每次运行结果和单线程执行的结果一样,那么就可以说是线程安全的。(摘录自:http://socket.blog.163.com/blog/static/20987300420107271440624/)

String是线程安全的,因为在查找过程是排他性的,在方法执行完之后其他线程才能获得这个方法的执行权,并不受JVM的调度的控制。

StringBuffer虽然是AbstractStringBuilder的子类,但是继承的方法加上了synchronized,所以也是排他性的。

Stringbuilder线程不安全一般是针对多线程中说,方法在执行过程中可以被JVM中断并使的其他线程获得控制权进行修改内置对象。

但是就线程安全的定义来说,线程安全是JVM的一种保护机制,在实际的操作中,在对于对象的多次操作和调用的过程也有可能会产生多样的结果,深入的了解可以参考上诉的链接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值