【2021-07-06】请说出 String,StringBuilder,StringBuffer 三者的区别?

未匹配的标注

请移步至::octocat:每日一题 查看更多的题目 ~

答:

String 类中使用 final 关键字修饰的字符数组保存字符串

private final char value[];

所以 String 对象是不可变的,这就导致了每次对 String 对象添加,更改或删除字符的操作都会产生一个新的 String 对象。不仅效率低下,而且浪费了空间。

StringBuilder 和 StringBuffer 的对象都是可变的,他们都继承了AbstractStringBuilder 类;任何对他们指向的字符串的操作都不会产生新的对象;他们之间的区别是:StringBuilder 是线程不安全的;而 StringBuffer 是线程安全的。

源码上可以体现出 StringBuffer 是线程安全的,来看一下两个类的 append 方法:

StringBuffer 的 append 方法:

@Override
public synchronized StringBuffer append(String str) {  
    super.append(str);  
    return this;  
}

StringBuilder 的 append 方法:

@Override
public StringBuilder append(String str) {
    super.append(str);
    return this;
}

我们可以看到 StringBuffer 和 StringBuilder 都直接调用了父类的append 方法;区别是 StringBuffer 有 synchronized 关键字为 append 方法加锁,所以保证了 StringBuffer 在使用中线程安全,但是这也说明了StringBuffer 的性能要略低于 StringBuilder。

三者的使用场景:

  1. 操作少量的数据时可以使用 String
  2. 单线程操作字符串缓冲区下的大量数据的时,适合使用 StringBuilder
  3. 多线程操作字符串缓冲区下的大量数据的时,适合使用 StringBuffer

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~