• Java 基础复习——StringBuffer 和 StringBuilder


    StringBuffer 和 StringBuilder

    StringBuffer 类 简介

    • java.lang.StringBuffer 代表可变的字符序列,可以对字符串内容进行增删

    • 很多方法和 String 相同,但 StringBuffer 是可变长度的

    • StringBuffer 是一个容器

    image

    注意:

    1. StringBuffer 的直接父类是 AbstractStringBuilder 有属性 char[] value,不是 final 修饰
    2. StringBuffer 实现了 Serializable,即 StringBuffer 的对象可以串行化(可以网络传输,可以保存到文件)
    3. StringBuffer 是一个 final 类,不能被继承

    StringBuffer 和 String 对比

    • String 保存的是字符串常量,里面的值不能更改,每次 String 类的更新实际上就是更改地址,效率较低 // private final char[ ] value
    • StringBuffer 保存的是字符串变量,里面的值可以更改,不用每次更新地址,效率较高 // char[ ] value 放在堆中

    StringBuffer的构造器

    // Constructor and Description
    StringBuffer()
    // 构造一个其中不带字符的字符串缓冲区,其初始容量为16个字符
    StringBuffer(CharSequence seq)
    // 构造一个字符串缓冲区,包含与指定的CharSequener相同的字符
    StringBuffer(int capacity)
    // 构造一个其中不带字符,但具有指定初始容量的的字符串缓冲区,即对char[]大小进行指定
    StringBuffer(String str)
    //// 构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容
    

    StringBuffer 和 String 的相互转换

    String ---> StringBuffer

    String s = "hello";
    

    方式一:

     StringBuffer b1 = new StringBuffer(s);
    

    方式二:

    StringBuffer b2 = new StringBuffer();
    b2.append(s);
    

    StringBuffer ---> String

    方式一:

    String s2 = b1.toString()
    

    方式二:

    String s3 = new String(b1);
    

    StringBuffer 常用方法

    StringBuffer	append()	// 增
    StringBuffer	delete(int start, int end)	// 删
    StringBuffer	insert() // 插入
    StringBuffer	replace(int start, int end, String str)	// 改
    int	indexOf(String str) // 查
    int	length() // 获取长度
    

    练习题

    String str = null;
    StringBuffer sb = new StringBuffer();
    sb.append(str);  // 调用的AbstractStringBuilder的 appendNull方法
    System.out.println(sb.length()); // 4 null --> value = {'n', 'u', 'l', 'l'}
    System.out.println(sb.capacity()); // 16
    
    
    System.out.println(sb);
    StringBuffer sb1 = new StringBuffer(str); //NullPointerException super(str.length() + 16);
    System.out.println(sb1);
    

    StringBuilder 类 简介

    • 一个可变的字符序列。此类提供与 StringBufffer 兼容的API,但不保证同步。被设计作为 StringBuffer 的建议替换,用在字符串被单个线程使用的时候。如果可能,建议有限采用该类,因在在大多数实现中,他比 StringBuffer 要快。两者的方法基本相同

    image

    注意:

    1. StringBuilder 是 final 类,不能被继承
    2. 继承了 AbstractStringBuilder,属性 Char[ ] value,因此字符序列是在堆中
    3. 实现了 Serialzable 接口,序列号(所谓序列号即可以保存类型和数据本身)
    4. StringBuilder 的方法,没有做互斥的处理,即没有 synchronized 关键字,因此在单线程的情况下使用

    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
      */
      

      效率测试

    long startTime = 0L;
    long endTime = 0L;
    // StringBuffer
    StringBuffer stringBuffer = new StringBuffer("");
    startTime = System.currentTimeMillis();
    for (int i = 0; i < 20000; i++) {
        stringBuffer.append(String.valueOf(i));
    }
    endTime = System.currentTimeMillis();
    System.out.println("StringBuffer的执行时间:" + (endTime - startTime));
    
    // StringBuilder
    StringBuilder stringBuilder = new StringBuilder("");
    startTime = System.currentTimeMillis();
    for (int i = 0; i < 20000; i++) {
        stringBuilder.append(String.valueOf(i));
    }
    endTime = System.currentTimeMillis();
    System.out.println("StringBuilder的执行时间:" + (endTime - startTime));
    
    //String
    String text = "";
    startTime = System.currentTimeMillis();
    for (int i = 0; i < 20000; i++) {
        text += i;
    }
    endTime = System.currentTimeMillis();
    System.out.println("String的执行时间:" + (endTime - startTime));
    
    // StringBuffer的执行时间:5
    //StringBuilder的执行时间:2
    //String的执行时间:1463
    // 测试结果:StringBuilder > StringBuffer > String
    

    String、StringBuffer 和 StringBuilder 的选择

    使用的原则、结论:

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

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

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

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

  • 相关阅读:
    使用GROUP BY分组
    【题目精刷】2022紫光展锐-数字IC设计
    代码随想录——Dota2参议院
    【django+vue】项目搭建、解决跨域访问
    IDEA web工程入门笔记
    An动画基础之元件的影片剪辑效果
    memmove函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用、自己实现函数 )
    【计算机网络】MTU和MSS
    【git】安装和基本配置
    探索GmSSL+Nginx实践及原理
  • 原文地址:https://www.cnblogs.com/ai135/p/17518877.html