Java字符串三剑客:String、StringBuilder、StringBuffer

63 阅读1分钟

String、StringBuilder、StringBuffer

回答

  1. String 是不可变的,
  2. StringBuilder 和 StringBuffer 是可变的。
  3. StringBuffer 是线程安全的,
  4. StringBuilder 是非线程安全的。

扩展

1、String 的不可变性
2、为什么设计成不可变的
3、String 和 + 如何实现的?
  • 示例代码

image-20241220184210203

  • 反编译如下

image-20250326164550284

  • Java 中的+ 对字符串的拼接,其实现原理是使用 StringBuilder.append
4、StringBuffer 和 StringBuilder
  • StringBuffer 类定义

    • public final class StringBuilder
          extends AbstractStringBuilder
          implements java.io.Serializable, CharSequence 
      
  • value 和 count 定义

    •       /**
             * The value is used for character storage.
             */
            char[] value;
            /**
             * The count is the number of characters used.
             */
            int count;
      
  • AbstractStringBuilder#append 定义

    • public AbstractStringBuilder append(String str) {
          if (str == null)
              return appendNull();
          int len = str.length();
          // 检查容量,
          ensureCapacityInternal(count + len);
          // 拷贝字符
          str.getChars(0, len, value, count);
          count += len;
          return this;
      }
      
  • StringBuffer#append 定义

    • // StringBuffer#append
      @Override
      public synchronized StringBuffer append(Object obj) {
          toStringCache = null;
          super.append(String.valueOf(obj));
          return this;
      }
      
  • StringBuffer 和 StringBuilder 最大的区别就是:StringBuffer 是线程安全的

5、不要在 for 中,使用 + 来拼接 String
  • 示例代码

image-20241220185755159

  • 反编译

image-20250326164927120

  • 频繁的新建对象,不仅仅会耗费时间,频繁的创建对象,还会造成内存资源的浪费。

From《阿里巴巴 Java 开发手册》建议:

在循环体内,字符串的连接方式。

使用 StringBuitder的 append 方法进行扩展。

而不要使用+