本文已收录至我的GitHub:Java开发宝典,欢迎大家给个Star:https://github.com/eson15/javaAll
我会持续更新,欢迎star!
微信搜索:武哥聊编程,关注这个Java菜鸟~
StringBuilder 和 StringBuffer 的问题已经是老生常谈了,但是为什么还有那么多面试官喜欢问这个问题呢?不知道,我觉得是面试官太low了……
不过我也来把这个知识点给大家总结一下,先说说他们的相同点。
说到这单,我又忍不住要跟大家唠叨唠叨 String 了,我们先看下 String 的一个例子:
String a = "123";
a = "456";
// 打印出来的a为456
System.out.println(a)
不是说 String 是不可改变的吗?这怎么就变了呢?逗我吗?其实是没变的,原来那个 123 没变,相当于重新创建了一个 456,然后把 a 指向了这个 456,那个 123 会被回收掉。看看我给大家画的图:
而 StringBuffer 和 StringBuilder 就不一样了,他们是可变的,当一个对象被创建以后,通过append()
、insert()
、reverse()
、setCharAt()
、setLength()
等方法可以改变这个字符串对象的字符序列。也来看个例子:
StringBuffer b = new StringBuffer("123");
b.append("456");
// b打印结果为:123456
System.out.println(b);
OK,那现在我们知道了,StringBuffer 和 StringBuilder 有个共同点,那就是它们代表一个字符可变的字符串。那除此之外,还有没有其他相同点呢?
肯定是有的,比如:
super.append(...)
。微信搜索:武哥聊编程,回复“笔记”,可以领取一份我亲自写的10万字Springboot经典学习笔记一份
StringBuffer 是线程安全的,StringBuilder 是非线程安全的。我们看源码都知道,StringBuffer 的方法上面都加了 synchronized 关键字,所以没有线程安全问题,但是性能会受影响,所以 StringBuilder 会比 StringBuffer 快,在单线程环境下,建议使用 StringBuilder。
另外还有个不同点是缓冲区。
先看下 StringBuilder 的toString()
方法:
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
再看下 StringBuffer 的toString()
方法:
@Override
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
可以看出:StringBuffer 每次获取 toString 都会直接使用缓存区的 toStringCache 值来构造一个字符串。而 StringBuilder 则每次都需要复制一次字符数组,再构造一个字符串。
所以, StringBuffer 对缓存区优化,不过 StringBuffer 的这个toString 方法仍然是同步的。
OK,StringBuffer 和 StringBuilder 就总结这么多吧,如有问题,欢迎指正。
【作者】:武哥
【公众号】:武哥聊编程。欢迎大家关注~
【作者简介】:同济大学,硕士。先后在华为、科大讯飞、拼多多采坑。一个自学 Java 的菜鸟,期待你的关注。
点赞是对我最大的鼓励
↓↓↓↓↓↓