当前位置: 首页 > 面试题库 >

String、StringBuffer和StringBuilder的区别是什么?

严阳成
2023-05-05

这篇文章主要介绍了String、StringBuffer、StringBuilder的区别详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下。放假在家里休息,闲来无事,想巩固巩固自己的基础知识。

Java中提供了两个类String和StringBuffer,它们用于储存和操作字符串

String类是操作数量不可变的字符串,而String对象一旦产生就不可以被修改,重新赋值其实是两个对象

String name = "小明";
name = "小红";


对已有的字符串修改时将生成新的对象;

StringBuffer是String字符串的缓冲区,StringBuffer类是可以对提供的字符串进行修改,不会生成新的对象,而且是线程安全的;

示例:

// 1~100组成一个字符串,用StringBuffer只创建一个对象,效率较高,而用String需要创建101个对象
StringBuffer sbf = new StringBuffer();
// 遍历
for (int i=0;i<=100; i++) {
    sbf.append(i);
}
String str = new String();
// ...
for (int i=0;i<=100; i++) {
    str = str + i;
}


StringBuilder和StringBuffer一样,都是继承自抽象类AbstractStringBuilder类,也是一个可变的字符序列。StringBuilder和StringBuffer非常相似,甚至有互相兼容的API,不过,StringBuilder不是线程安全的,这是和StringBuffer的主要区别。

层次结构如下:

StringBuilder类被设计成在不需要多线程安全的情况下替换StringBuffer类的。如果程序中不需要多线程安全,推荐使用StringBuilder类,因为没有了同步的操作而速度上比较快。

StringBuilder和StringBuffer一样,主要的操作有append和insert等。

 

三者都是处理字符串常用的类,不同在于:

速度上:StringBuilder>StringBuffer>String;

安全上:StringBuffer线程安全,StringBuilder线程不安全;

原因在于,String的每次改变都会涉及到字符数组的复制,而StringBuffer和StringBuilder直接在字符数组上改变;同时,StringBuffer是线程安全的,而StringBuilder线程不安全,没有StringBuffer的同步,所以StringBuilder快于StringBuffer。

总结:

String:适用于少量的字符串操作的情况;长度大小不可变;

StringBuilder:长度可变;对字符串修改的较多;适用于单线程下在字符缓冲区进行大量操作的情况;速度快

StringBuffer:长度可变;对字符串修改的较多;适用多线程下在字符缓冲区进行大量操作的情况

在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的

  如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

(一个线程访问一个对象中的synchronized(this)同步代码块时,其他试图访问该对象的线程将被阻塞)

 

 类似资料:
  • 主要内容:总结在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。String 类是不可变类,即一旦一个 String 对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。 Java 提供了两个可变字符串类 StringBuffer 和 StringBuilder,中文翻译为“字符串缓冲区”。 StringBuilder 类是 JDK 1.5 新增的类,

  • 本文向大家介绍String 和 StringBuffer、StringBuilder 的区别是什么?相关面试题,主要包含被问及String 和 StringBuffer、StringBuilder 的区别是什么?时的应答技巧和注意事项,需要的朋友参考一下 可变性 简单的来说:String 类中使用 final 关键字修饰字符数组来保存字符串,,所以 String 对象是不可变的。而StringBuil

  • 本文向大家介绍Java中StringBuffer和StringBuilder区别,包括了Java中StringBuffer和StringBuilder区别的使用技巧和注意事项,需要的朋友参考一下 早先用Java的时候,知道有个类叫StringBuffer,用来拼接较长的字符串。转到C#之后,也有一个似类功能的类叫作StringBuilder,简写都是sb,非常好记。 再后来转移回Java的时候,发

  • 问题内容: 和之间的主要区别是什么?在决定其中任何一个时是否存在性能问题? 问题答案: 是同步的,不是。

  • 问题内容: 和之间的主要区别是什么?在决定其中任何一个时是否存在性能问题? 问题答案: 因为不是更快。 这是一个简单的基准测试: 一个试运行给出的数字2241 ms为StringBufferVS 753 ms的StringBuilder。

  • 问题内容: Java中的String和StringBuffer有什么区别? 字符串有最大大小吗? 问题答案: 用于处理无法更改的字符串(只读和不可变的)。 用于表示可以修改的字符。 明智的执行连接时,速度更快。这是因为,当连接a时,由于每次都是不可变的,因此每次(内部)都将创建一个新对象。 您也可以使用类似于未同步的选项。对任一这些的最大大小为(2 31 - 1 = 2147483647)或最大堆