String、StringBuffer、StringBuilder的区别

概述

相信使用java的小伙伴对于String、StringBuffer、StringBuilder这三者已经很熟悉,特别是对于String是我们常用的数据类型。那么这三者有什么区别呢?是否是线程安全的呢?在开发中我们又该如何选择呢?

String、StringBuffer、StringBuilder区别

简单的来说,String是不可变的;StringBuffer和StringBuilder是可变的。可以通过看源码来查看其底层的实现。

String源码

可以看到String是使用了private final char value[]来存放字符串,因此是不可变的。

StringBuffer和StringBuilder继承关系

     

StringBuffer和StringBuilder都继承了AbstractStringBuilder,而AbstractStringBuilder是使用char value[]来存放字符串,因此StringBuffer和StringBuilder都是可变的。

线程安全性

String 中的对象是不可变的,也就可以理解为常量,线程安全。

AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

StringBuffer源码

StringBuilder源码

String、StringBuffer、StringBuilder的使用总结

每次对String类型进行修改的时候,都会生产一个新的String对象,然后将指针指向新的String对象。

StringBuffer和StringBuilder修改的时候,都是对对象本身的操作,而不是生辰新的对象。

并且在相同的情况下,使用StringBuilder比StrinBuffer仅能获得10%~15%的性能提升,但是却要冒多线程不安全的风险。

综合这些要素,可以得到如下总结:

(1)操作少量的数据或者定义之后后续不会改变的数据:使用String

(2)单线程字符串缓冲区下操作大量数据:使用StingBuilder

(3)多线程字符串换中去下操作大量数据:使用StringBuffer

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值