StringBuilder

SOBER大约 2 分钟

StringBuilder

基本介绍

  • 一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步(StringBuffer 不是线程安全)。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快
  • 在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法以接受任意类型的数据。、

StringBuilder常用方法

StringBuilder 和 StringBuffer 均代表可变的字符序列,方法是一样的,所 以使用和StringBuffer一样,参考StringBuffer

解读

  1. StringBuilder 继承 AbstractstringBuilder 类
  2. 实现了 Serializable,说明 StringBuilder 对象是可以串行化(对象可以网络传输,可以保存到文件)
  3. StringBuilder 是 final 类,不能被继承
  4. StringBuilder 对象字符序列仍然是存放在其父类 AbstractstringBuilder 的 char[] value;因此,字符序列是堆中
  5. StringBpilder 的方法,没有做互斥的处理,即没有 synchronized 关键字,因此在单线程的情况下使用 StringBpilder

String、StringBuffer 和 StringBuilder 的比较

  1. StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且方法也一样
  2. String:不可变字符序列,效率低,但是复用率高,
  3. StringBuffer:可变字符序列、效率较高(增删)、线程安全,看源码
  4. StringBuilder:可变字符序列、效率最高、线程不安全
  5. String 使用注意说明:
    1. string s="a" 创建了一个字符串
    2. s+="b" 实际上原来的 "a" 字符串对象已经丢弃了,现在又产生了一个字符串 s+"b"(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能
    3. 结论:如果我们对 String 做大量修改,不要使用 String
  6. 效率:StringBuilder > StringBuffer > String

String、StringBuffer 和 StringBuilder 的选择

  1. 如果字符串存在大量的修改操作,一般使用 StringBuffer 或 StringBuilder
  2. 如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder
  3. 如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer
  4. 如果我们字符串很少修改,被多个对象引用,使用 String ,比如配置信息等

效率测试


        long startTime = 0L;
        long endTime = 0L;


        StringBuffer buffer = new StringBuffer("");
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 200000; i++){
            buffer.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuffer的执行时间: " + (endTime - startTime));

        StringBuilder builder = new StringBuilder("");
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 200000; i++){
            builder.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuilder的执行时间: " + (endTime - startTime));

        String text = "";
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 200000; i++){
            text = text + i;
        }
        endTime = System.currentTimeMillis();
        System.out.println("String的执行时间: " + (endTime - startTime));