StringBuffer 和 StringBuilder 的区别

StringBuffer 和 StringBuilder 的区别

    • StringBuffer 和 StringBuilder 的类结构:
    • 区别1:线程安全
    • 区别2:缓冲区
    • 区别3:性能
    • synchronized
    • 总结

StringBuffer 和 StringBuilder 的类结构:

在这里插入图片描述

区别1:线程安全

StringBuffer:线程安全,StringBuilder:线程不安全。因为 StringBuffer 的所有公开方法都是 synchronized 修饰的,而 StringBuilder 并没有 synchronized 修饰。

StringBuffer 代码片段:
在这里插入图片描述

StringBuilder 代码片段:
在这里插入图片描述

区别2:缓冲区

StringBuffer 代码片段:
在这里插入图片描述

StringBuilder 代码片段:
在这里插入图片描述
StringBuffer 每次获取 toString 都会直接使用缓存区的 toStringCache 值来构造一个字符串。

StringBuilder 则每次都需要复制一次字符数组,再构造一个字符串。

所以, StringBuffer 对缓存区优化,不过 StringBuffer 的这个toString 方法仍然是同步的。

区别3:性能

既然 StringBuffer 是线程安全的,它的所有公开方法都是同步的,StringBuilder 是没有对方法加锁同步的,所以毫无疑问,StringBuilder 的性能要远大于 StringBuffer。

总结

StringBuffer 适用于用在多线程操作同一个 StringBuffer 的场景,如果是单线程场合 StringBuilder 更适合。

                                
原创文章 5获赞 3访问量 2688
synchronized
  • 一段synchronized代码被执行之前,他要先拿到着段代码的执行权限,在Java里面就是拿到某个同步对象的锁(一个对象只有一把锁);如果这个时候同步对象的锁被其它线程拿走了,那它这个线程就只能等待,(线程阻塞在锁城队列中),取到锁后,他就开始执行同步代码,线程执行完同步代码后马上就把锁还给同步对象,其它在锁池中等待的某个线程就可以拿到同步锁执行同步代码了,这样就保证同步代码在同一时刻是有一个线程在执行

你可能感兴趣的:(StringBuffer 和 StringBuilder 的区别)