Java中String、StringBuilder、StringBuffer区别

①可变性

String类不可变,它每次申请固定长度的char字符数组final char value[],并且不可修改,平时所使用的+号字符串拼接实际上是开辟了多个内存空间,最后结果字符串的堆内存可用,其余的空间全部成为垃圾。

StringBuffer和StringBuilder都是可变型字符串类,它们都继承自AbstractStringBuilder类,其中的字符数组定义是可变的char[] value,在其中每次字符串拼接如果容量充足就在当前堆内存改变,如果不足才开辟新的空间,其中每次扩容是原来容量的2倍+2,源码中是这样实现的:(value.length << 1) + 2,最大容量是Integer.MAX_VALUE - 8,为什么减8呢?因为对象头需要占用一定空间,实际占用大小因虚拟机位数而定。

②多线程安全

String和StringBuffer是多线程安全的,String的字符数组是final的,所以它不存在修改也就天然线程安全,而StringBuffer则是通过同步锁实现线程安全的,它的所有方法都是使用的synchronized修饰保证其线程安全性。而StringBuilder则是非线程安全的。

③适用条件

当字符串拼接很少时适合String类。当字符串拼接很频繁时,如果仅在单线程操作变量,适合StringBuilder;如果在多线程情况下,使用StringBuffer能更好保证其安全性。在单线程情况下,StringBuilder相比于StringBuffer有15%左右的性能提升。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值