【夯实Java基础05】为什么面试官总喜欢问StringBuffer 和 StringBuilder 的区别

本文已收录至我的GitHub:Java开发宝典,欢迎大家给个Star:https://github.com/eson15/javaAll
我会持续更新,欢迎star!
微信搜索:武哥聊编程,关注这个Java菜鸟~



StringBuilder 和 StringBuffer 的问题已经是老生常谈了,但是为什么还有那么多面试官喜欢问这个问题呢?不知道,我觉得是面试官太low了……🤣🤣

不过我也来把这个知识点给大家总结一下,先说说他们的相同点。

1. 相同点

说到这单,我又忍不住要跟大家唠叨唠叨 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 有个共同点,那就是它们代表一个字符可变的字符串。那除此之外,还有没有其他相同点呢?

肯定是有的,比如:

  1. StringBuilder 与 StringBuffer 有公共父类 AbstractStringBuilder (抽象类);
  2. StringBuilder、StringBuffer 的方法都会调用 AbstractStringBuilder 中的公共方法,如super.append(...)

微信搜索:武哥聊编程,回复“笔记”,可以领取一份我亲自写的10万字Springboot经典学习笔记一份

2. 不同点

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 就总结这么多吧,如有问题,欢迎指正。

作者info

【作者】:武哥
【公众号】:武哥聊编程。欢迎大家关注~
【作者简介】:同济大学,硕士。先后在华为、科大讯飞、拼多多采坑。一个自学 Java 的菜鸟,期待你的关注。

点赞是对我最大的鼓励
↓↓↓↓↓↓

评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值