StringBuffer 和 StringBuilder的区别

发布时间 2023-05-24 09:40:02作者: shirleyLee

1、线程安全性:

StringBuffer 是线程安全的,而 StringBuilder 不是。

如果在多线程环境下使用 StringBuilder,可能会发生竞态条件等并发问题。

 

StringBuffer 和 StringBuilder 都继承于 AbstractStringBuilder类:

字符串的append方法调用的是AbstractStringBuillder的append方法,逻辑:

1 ) 获得需要添加的字符串的length

2 ) 判断是否能够放下新添加的字符串并进行扩充

3 ) 修改value 数组 和 字符串的长度

当用两个线程同时去填下相同长度的字符串的时候,在进行容量判断的时候,每个线程都会的到相同地结果,将字符串扩充到相应的数值,但这个数值可能只可以放得下一个线程的字符串却放不下两个的,因此就会出现 数组越界的异常而同时,扩充后的字符串的长度也会不正常。

然而StringBuffer却不会出现这个问题,因为其给append方法添加了锁,实现了线程同步。

 

2、性能:

由于 StringBuffer 保证了线程安全性,它的性能通常比 StringBuilder 差。

在单线程环境下,StringBuilder 的速度会比 StringBuffer 更快。

 

3、用途:

如果你需要在多线程环境下操作字符串,那么应该使用 StringBuffer。

如果你使用的是单个线程,并且目标是快速构建字符串,则可以使用 StringBuilder。

 

4、API:

StringBuffer 和 StringBuilder 大部分 API 是一样的。

StringBuffer 提供了一些额外的 API,如 length()、capacity() 和 ensureCapacity()。

 

 

 

在处理数据敏感的场合,如密码、个人信息等,建议使用 StringBuffer,而日志打印等场合则可以使用 StringBuilder。