StringBuffer 和 StringBuilder 它们都是可变的字符串,不过它们之间的区别是 Java 初中级面试出现几率十分高的一道题。这么简单的一道题,在面试过程中却经常遇到很多求职者说反,搞不清使用场景的情况。
今天,带大家彻底搞懂 StringBuffer 和 StringBuilder 的几个区别和它们的应用场景,如果你是大牛,请略过,如果你是菜鸟,或者对这两个不是很清楚,可以学习一下,也可以为年底的面试加油冲刺。
先看看 StringBuffer 和 StringBuilder 的类结构吧:
其实很简单,就是继承了一个抽象的字符串父类:AbstractStringBuilder。下面我们再来看看它们的三个区别。
区别1:线程安全
StringBuffer:线程安全,StringBuilder:线程不安全。因为 StringBuffer 的所有公开方法都是 synchronized 修饰的,而 StringBuilder 并没有 StringBuilder 修饰。
StringBuffer 代码片段:
- @Override
- public synchronized StringBuffer append(String str) {
- toStringCache = null;
- super.append(str);
- return this;
- }
区别2:缓冲区
StringBuffer 代码片段:
- private transient char[] toStringCache;
- @Override
- public synchronized String toString() {
- if (toStringCache == null) {
- toStringCache = Arrays.copyOfRange(value, 0, count);
- }
- return new String(toStringCache, true);
- }
StringBuilder 代码片段:
- @Override
- public String toString() {
- // Create a copy, don't share the array
- return new String(value, 0, count);
- }
可以看出,StringBuffer 每次获取 toString 都会直接使用缓存区的 toStringCache 值来构造一个字符串。
而 StringBuilder 则每次都需要复制一次字符数组,再构造一个字符串。
所以,缓存冲这也是对 StringBuffer 的一个优化吧,不过 StringBuffer 的这个toString 方法仍然是同步的。
区别3:性能
既然 StringBuffer 是线程安全的,它的所有公开方法都是同步的,StringBuilder 是没有对方法加锁同步的,所以毫无疑问,StringBuilder 的性能要远大于 StringBuffer。
总结
所以,StringBuffer 适用于用在多线程操作同一个 StringBuffer 的场景,如果是单线程场合 StringBuilder 更适合。
访问速度慢,服务器不稳定 服务器是网站运行的根本,如果服务器不稳定,网站也就...
背景 当您需批量对ECS实例开关机状态进行管理时,通过OOS 定时开关机 可轻松搞定...
互联网科技时代,相信大家对人脸识别都不会陌生,在生活的方方面面多多少少都会...
因为用户所属 “角色” 未配置 “管理权限” ,用户在新建用户或资源时,不能配...
1.保护自己,爱护他人,请不要半夜出来吓人 2.格式化自己,只为删除你。 3.知...
Bucket Policy是阿里云OSS推出的针对Bucket的授权策略,您可以通过Bucket Policy...
近日,阿里云参与编写的《JR/T 0223-2021 金融数据安全 数据安全生命周期规范》...
通过函数计算的Custom Runtime,您可以在函数计算平台使用Lua来编写函数。本文介...
操作场景 伸缩组是具有相同属性和应用场景的云服务器和伸缩策略的集合,是启停伸...
基本介绍 赫夫曼编码也翻译为(哈夫曼编码)Huffman Coding,又称为霍夫曼编码,是...