StringBuffer和StringBuilder类

StringBuffer

  • StringBuffer 是 Java 中用于处理可变字符串的类。它与 StringBuilder 类似,但有一个重要的区别:StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的
  • 可变性:StringBuffer 的内容可以被修改(追加、插入、删除等)
  • StringBuffer类是final的,不能被继承
  • StringBuffer的内容是存储在char[] value中的,不是每次加入字符串都需要创建新的对象,所以效率高于String
  • StringBuffer 在创建时就会分配一定的空间,后续在 append 字符的过程中,若当前空间不足,会再次进行空间分配

StringBuffer的存储机制和扩容原理

  • StringBuffer 的底层实现是一个可变的字符数组(char[] 或 byte[])。在 Java 9 及更高版本中,StringBuffer 使用 byte[] 来存储字符数据,并根据字符编码(Latin-1 或 UTF-16)动态调整存储方式
  • StringBuffer 的 value[] 数组存储在堆内存中
  • StringBuffer 的默认初始容量为 16
  • 如果通过构造方法指定了初始容量,则以指定容量为准
  • 当 StringBuffer 的字符数量(count)超过当前容量时,会触发扩容操作
  • 新容量通常为当前容量的 2 倍加 2(newCapacity = (oldCapacity << 1) + 2)
  • 如果新容量仍然不足,则直接扩容到所需的最小容量
  • 扩容的具体实现是通过 Arrays.copyOf() 方法将旧数组的内容复制到新数组中

当调用 append() 方法时,StringBuffer 会执行以下步骤:

  1. 检查当前容量是否足够。
  2. 如果容量不足,则触发扩容。
  3. 将新字符复制到 value[]数组中。
  4. 更新 count 字段。

StringBuffer常用方法

  1. 构造方法

    • 默认构造方法,创建一个初始容量为 16 的空 StringBuffer 对象

    • 指定初始容量,创建一个指定初始容量的空 StringBuffer 对象

    • 基于字符串初始化,创建一个包含指定字符串内容的 StringBuffer 对象,初始容量为 str.length() + 16

      StringBuffer sb = new StringBuffer();
      StringBuffer sb = new StringBuffer(int capacity);
      StringBuffer sb = new StringBuffer(String str);
      
  2. 实例方法

    • append()将指定内容追加到 StringBuffer 的末尾

      需要注意的是,当append(null)的时候是将null作为字符串添加进去

      StringBuffer sb = new StringBuffer("Hello");
      sb.append(" World"); // sb = "Hello World"
      
      String str=null;
      sb.append(str);//这里将null作为字符串添加进去
      StringBuffer sb = new StringBuffer(str)//报空指针异常的错误
      
    • insert():在指定位置插入内容

      StringBuffer sb = new StringBuffer("Hello");
      sb.insert(5, " World"); // sb = "Hello World"
      
    • delete():删除指定范围的字符

      StringBuffer sb = new StringBuffer("Hello World");
      sb.delete(5, 11); // sb = "Hello"
      
    • deleteCharAt():删除指定位置的字符

      StringBuffer sb = new StringBuffer("Hello");
      sb.deleteCharAt(1); // sb = "Hllo"
      
    • replace():替换指定范围的字符

      StringBuffer sb = new StringBuffer("Hello World");
      sb.replace(6, 11, "Java"); // sb = "Hello Java"
      
    • reverse():反转字符串的内容

      StringBuffer sb = new StringBuffer("Hello");
      sb.reverse(); // sb = "olleH"
      
    • length():返回当前字符串的长度

    • capacity():返回当前 StringBuffer 的容量

      int len = sb.length(); // len = 5
      int cap = sb.capacity(); // cap = 21 (初始容量为 16 + 字符串长度 5)
      
    • setLength():设置字符串的长度。如果新长度小于当前长度,则截断字符串;如果大于当前长度,则用空字符填充

      StringBuffer sb = new StringBuffer("Hello");
      sb.setLength(3); // sb = "Hel"
      sb.setLength(10); // sb = "Hel       " (填充空字符)
      
    • toString():将 StringBuffer 转换为 String 对象,toString() 方法只是创建了一个新的 String 对象,而不会影响原始的 StringBuffer 对象

    • 这个新的 String 对象不会自动添加到字符串常量池中,除非显式调用 intern() 方法

    • 字符串常量池只存储字符串字面量和通过 intern() 方法添加的字符串

    • toString() 方法的作用是将 StringBuffer 的内容转换为一个不可变的 String 对象。这个 String 对象是一个全新的对象,与原始的 StringBuffer 对象是独立的

      String str = sb.toString(); // str = "Hello"
      
一些注意点
需要注意的是,当append(null)的时候是将null作为字符串添加进去
如果构造器使用使用null会抛出空指针异常

StringBuilder

  • StringBuilder 和 StringBuffer 的 API 几乎是完全相同的。它们都继承自 AbstractStringBuilder 类,因此提供了相同的方法来操作字符串。唯一的区别在于 线程安全性

  • StringBuilder 是一个非线程安全的可变字符串类,适用于单线程环境。

  • 它提供了丰富的方法来操作字符串,如追加、插入、删除、替换和反转等。

  • StringBuilder 的性能通常比 StringBuffer 更高,因为它没有同步开销。

  • 在多线程环境中,建议使用 StringBuffer 以确保线程安全;在单线程环境中,建议使用 StringBuilder 以获得更好的性能。

posted @   QAQ001  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示