StringBuilder

基本介绍

  1. 一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步(StringBuilder 不是线程安全)。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer要快【后面测】。

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

 

结构剖析

image-20220402101720862

与StringBuffer继承类和实现结构一致,可看StirngBuffer解释

 

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

 

 

StringBuilder StringBuffer String比较

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

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

  1. StringBuffer∶ 可变字符序列、效率较高(增删)、线程安全,看源码StringBuilder∶ 可变字符序列、效率最高、线程不安全

    • String使用注意说明∶

      • string s="a";//创建了一个字符串

      • s+= "b";//实际上原来的"a"字符串对象已经丢弃了,现在又产生了一个字符串s+"b"(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能

      • 结论∶如果我们对String 做大量修改,不要使用String

 

效率测试

public static void main(String[] args) {
       long startTime = 0L;
       long endTime = 0L;
       StringBuffer buffer = new StringBuffer("");
       startTime = System.currentTimeMillis();
       for (int i = 0; i < 80000; i++) {
           //StringBuffer 拼接 20000 次
           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 < 80000; i++) {
           //StringBuilder 拼接 20000 次
           builder.append(String.valueOf(i));
      }
       endTime = System.currentTimeMillis();
       System.out.println("StringBuilder 的执行时间:" + (endTime - startTime));


       startTime = System.currentTimeMillis();
       String text = "";
       for (int i = 0; i < 80000; i++) {
           //StringBuilder 拼接 20000 次
           text = text + i;
      }
       endTime = System.currentTimeMillis();
       System.out.println("String 的执行时间:" + (endTime - startTime));
  }

 

image-20220402105223821

使用原则

结论:

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

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

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

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

posted @ 2022-04-02 10:55  子非鱼!  阅读(71)  评论(0编辑  收藏  举报