StringBuffer和StringBuilder

StringBuffer和StringBuilder

String类是保存字符串常量的。每次更新都需要重新开辟空间,效率较低,由此StringBuilder和 StringBuffer 就被设计出来增强String的功能,以提高效率。

StringBuffer

基本介绍

  1. StringBuffer 的直接父类 是 AbstractStringBuilder
  2. StringBuffer 实现了 Serializable, 即 StringBuffer 的对象可以串行化
  3. 在父类中 AbstractStringBuilder 有属性 char[] value,不是 final
    该 value 数组存放 字符串内容,引出存放在堆中的
  4. StringBuffer 是一个 final 类,不能被继承
  5. 因为 StringBuffer 字符内容是存在 char[] value, 所有在变化(增加/删除)
    不用每次都更换地址(即不是每次创建新对象), 所以效率高

String VS StringBuffer

  1. String保存的字符串常量,里面的值不能被修改,每次更新就是修改地址,效率低。
    private final char value[]
  2. StringBuffer保存的是字符串变量,里面的值可以修改,每次更新就是在更新内容,不必更新地址,效率高 char[] value 这个放在堆。

String 和StringBuffer相互转换

public static void main(String[] args) {
    //看 String——>StringBuffer
        String str = "hello tom";
    //方式 1 使用构造器
    //注意: 返回的才是 StringBuffer 对象,对 str 本身没有影响
    StringBuffer sb = new StringBuffer(str);
    //方式 2 使用的是 append 方法
    StringBuffer sb1 = new StringBuffer();
    sb1 = sb1.append(str);
    
    
    //看看 StringBuffer ->String
    StringBuffer sb3 = new StringBuffer("zbc");
    //方式 1 使用 StringBuffer 提供的 toString 方法
    String s = sb3.toString();
    //方式 2: 使用构造器来搞定
    String s1 = new String(sb3);
}

StringBuffer类常用方法

  • append 增加
  • delete 删 s.delete(2,5) 这里删除的是索引[2, 5)左闭右开,也就是索引2,3,4三个字符
  • replace 改 s.replace(2, 5, "那必须是我了") 这里同样[2, 5),把索引2-4三个替换成"那必须是我了"
  • indexOf 查,查询指定子串在字符串第一次出现的索引,找不到返回-1
  • insert 插入 s.insert(9, "就这?") 这里是在索引9位置插入字符串"就这?"
  • length 长度 显示字符串长度,很常见。

StringBuilder

可变的字符序列,提供与StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全)。该类是StringBuffer的简易替换,用于字符串缓冲区被翻个线程使用的时候。尽可能的情况下多用此类,因为它,快。

StringBuilder主要操作是append和insert方法,可以重载这些方法接受任意类型的数据

基本介绍

  1. StringBuilder 继承 AbstractStringBuilder 类

  2. 实现了 Serializable ,说明 StringBuilder 对象是可以串行化(对象可以网络传输,可以保存到文件)

  3. StringBuilder 是 final 类, 不能被继承

  4. StringBuilder 对象字符序列仍然是存放在其父类 AbstractStringBuilder 的 char[] value;
    因此,字符序列是堆中

  5. StringBuilder 的方法,没有做互斥的处理,即没有 synchronized 关键字,因此在单线程的情况下使用StringBuilde

StringBuilder常用方法

StringBuilder和StringBuffer都是代表可变字符序列,方法都是一样的,所以使用相同

String、StringBuffer 和 StringBuilder

比较

  1. StringBuilder和 StringBuffer非常类似,均代表可变的字符序列,而且方法也一样

  2. String:不可变字符序列,效率低,但是复用率高。

  3. StringBuffer:可变字符序列、效率较高(增删)、线程安全,看源码

  4. StringBuilder:可变字符序列、效率最高、线程不安全

  5. String使用注意说明:
    string s="a";//创建了一个字符串
    s += "b";//实际上原来的"a"字符串对象已经丢弃了,现在又产生了一个字符串s+"b”(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大,影响程序的性能=>结论:如果我们对String做大量修改,不要使用String

选择

使用的原则,结论:

  1. 如果字符串存在大量的修改操作,一般使用 StringBuffer 或StringBuilder

  2. 如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder

  3. 如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer

  4. 如果我们字符串很少修改,被多个对象引用,使用String,比如配置信息等

posted @ 2021-11-17 15:48  独高的浮云  阅读(43)  评论(0)    收藏  举报