StringBuilder类

StringBuilder类

一、结构剖析

  1. 一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步(StringBuilder 不是线程安全的)。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer要快。
  2. 在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。
//StringBuilder类细节:
public class StringBuilder01 {
    public static void main(String[] args) {
        //1. StringBuilder 继承 AbstractStringBuilder 类
        //2. 实现了 Serializable 接口,说明StringBuilder对象是可以串行化(对象可以网络传输,可以保存文件)
        //3. StringBuilder 是 final类,不能被继承
        //4. StringBuilder 对象字符序列仍然是存放在其父类 AbstractStringBuilder 的 char[] value;
        //5. StringBuilder 的方法,没有做互斥的处理,即没有synchronized 关键字,因此在单线程的情况下使用StringBuilder
        StringBuilder stringBuilder = new StringBuilder();

    }
}

二、StringBuilder常用方法

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

三、StringBuilder应用

  • 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。

  • String、StringBuffer和StringBuilder的效率测试

    效率:StringBuilder > StringBuffer > String

    public class StringVsStringBufferVsStringBuilder {
        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
                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
                builder.append(String.valueOf(i));
            }
            endTime = System.currentTimeMillis();
            System.out.println("StringBuiler的执行时间:" + (endTime - startTime));
    
            String text = "";
            startTime = System.currentTimeMillis();
            for (int i = 0; i < 80000; i++) {//StringBuilder
                text = text + i;
            }
            endTime = System.currentTimeMillis();
            System.out.println("String的执行时间:" + (endTime - startTime));
        }
    }
    //运行结果:
    //StringBuffer的执行时间:12
    //StringBuiler的执行时间:5
    //String的执行时间:3695
    
  • String、StringBuffer和StringBuilder的选择

    使用原则,结论:

    1. 如果字符串存在大量的修改操作,一般使用 StringBuffer 或 StringBuilder
    2. 如果字符串存在大量的修改操作,并且在单线程的情况,使用StringBuileder
    3. 如果字符串存在大量的修改操作,并且在多线程的情况,使用StringBuffer
    4. 如果我们字符串很少修改,被多个对象引用,使用String,比如配置信息等
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » StringBuilder类