• StringBuffer类和StringBuilder类


    1.StringBuffer 类基本介绍

    • java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删。
    • 很多方法与String相同,但StringBuffer是可变长度的
    • StringBuffer是一个容器。

    1670245098121

    1670245122753

    1. public class StringBuffer01 {
    2. public static void main(String[] args) {
    3. //老韩解读
    4. //1. StringBuffer 的直接父类 是 AbstractStringBuilder
    5. //2. StringBuffer 实现了 Serializable, 即StringBuffer的对象可以串行化
    6. //3. 在父类中 AbstractStringBuilder 有属性 char[] value,不是final
    7. // 该 value 数组存放 字符串内容,因此存放在堆中的
    8. //4. StringBuffer 是一个 final类,不能被继承
    9. //5. 因为StringBuffer 字符内容是存在 char[] value, 所有在变化(增加/删除)
    10. // 不用每次都更换地址(即不是每次创建新对象), 所以效率高于 String
    11. StringBuffer stringBuffer = new StringBuffer("hello");
    12. }
    13. }

    2.String VS StringBuffer

    1. String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率较低//private final char value[l;

    2. StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上可以更新内容,不用每次更新地址,效率较高//char[] value;这个放在堆.

    1670245786268

    1. public class StringBuffer02 {
    2. public static void main(String[] args) {
    3. //构造器的使用
    4. //老韩解读
    5. //1. 创建一个 大小为 16的 char[] ,用于存放字符内容
    6. StringBuffer stringBuffer = new StringBuffer();
    7. //2 通过构造器指定 char[] 大小
    8. StringBuffer stringBuffer1 = new StringBuffer(100);
    9. //3. 通过 给一个String 创建 StringBuffer, char[] 大小就是 str.length() + 16
    10. StringBuffer hello = new StringBuffer("hello");
    11. }
    12. }

    在开发中,我们经常需要将String 和StringBuffer进行转换,看看如何实现,

    1. public class StringAndStringBuffer {
    2. public static void main(String[] args) {
    3. //看 String——>StringBuffer
    4. String str = "hello tom";
    5. //方式1 使用构造器
    6. //注意: 返回的才是StringBuffer对象,对str 本身没有影响
    7. StringBuffer stringBuffer = new StringBuffer(str);
    8. //方式2 使用的是append方法
    9. StringBuffer stringBuffer1 = new StringBuffer();
    10. stringBuffer1 = stringBuffer1.append(str);
    11. //看看 StringBuffer ->String
    12. StringBuffer stringBuffer3 = new StringBuffer("韩顺平教育");
    13. //方式1 使用StringBuffer提供的 toString方法
    14. String s = stringBuffer3.toString();
    15. //方式2: 使用构造器来搞定
    16. String s1 = new String(stringBuffer3);
    17. }
    18. }

    3.StringBuffer 类常见方法

    1670246773892

    1. public class StringBufferMethod {
    2. public static void main(String[] args) {
    3. StringBuffer s = new StringBuffer("hello");
    4. //增
    5. s.append(',');// "hello,"
    6. s.append("张三丰");//"hello,张三丰"
    7. s.append("赵敏").append(100).append(true).append(10.5);//"hello,张三丰赵敏100true10.5"
    8. System.out.println(s);//"hello,张三丰赵敏100true10.5"
    9. //删
    10. /*
    11. * 删除索引为>=start &&
    12. * 解读: 删除 11~14的字符 [11, 14)
    13. */
    14. s.delete(11, 14);
    15. System.out.println(s);//"hello,张三丰赵敏true10.5"
    16. //改
    17. //老韩解读,使用 周芷若 替换 索引9-11的字符 [9,11)
    18. s.replace(9, 11, "周芷若");
    19. System.out.println(s);//"hello,张三丰周芷若true10.5"
    20. //查找指定的子串在字符串第一次出现的索引,如果找不到返回-1
    21. int indexOf = s.indexOf("张三丰");
    22. System.out.println(indexOf);//6
    23. //插
    24. //老韩解读,在索引为9的位置插入 "赵敏",原来索引为9的内容自动后移
    25. s.insert(9, "赵敏");
    26. System.out.println(s);//"hello,张三丰赵敏周芷若true10.5"
    27. //长度
    28. System.out.println(s.length());//22
    29. System.out.println(s);
    30. }
    31. }
    1. public class StringBufferExercise01 {
    2. public static void main(String[] args) {
    3. String str = null;// ok
    4. StringBuffer sb = new StringBuffer(); //ok
    5. sb.append(str);//需要看源码 , 底层调用的是 AbstractStringBuilder 的 appendNull
    6. System.out.println(sb.length());//4
    7. System.out.println(sb);//null
    8. //下面的构造器,会抛出NullpointerException
    9. StringBuffer sb1 = new StringBuffer(str);//看底层源码 super(str.length() + 16);
    10. System.out.println(sb1);
    11. }
    12. }

    1670247738640

    1670247896720

    练习2

    1. 输入商品名称和商品价格,要求打印效果示例, 使用前面学习的方法完成:
    2. 商品名 商品价格
    3. 手机 123,564.59 //比如 价格 3,456,789.88
    4. 要求:价格的小数点前面每三位用逗号隔开, 再输出。
    5. 思路分析
    6. 1. 定义一个Scanner 对象,接收用户输入的 价格(String)
    7. 2. 希望使用到 StringBuffer的 insert ,需要将 String 转成 StringBuffer
    8. 3. 然后使用相关方法进行字符串的处理
    1. public class StringBufferExercise02 {
    2. public static void main(String[] args) {
    3. /*
    4. 输入商品名称和商品价格,要求打印效果示例, 使用前面学习的方法完成:
    5. 商品名 商品价格
    6. 手机 123,564.59 //比如 价格 3,456,789.88
    7. 要求:价格的小数点前面每三位用逗号隔开, 在输出。
    8. 思路分析
    9. 1. 定义一个Scanner 对象,接收用户输入的 价格(String)
    10. 2. 希望使用到 StringBuffer的 insert ,需要将 String 转成 StringBuffer
    11. 3. 然后使用相关方法进行字符串的处理
    12. 代码实现
    13. */
    14. //new Scanner(System.in)
    15. String price = "8123564.59";
    16. StringBuffer sb = new StringBuffer(price);
    17. //先完成一个最简单的实现123,564.59
    18. //找到小数点的索引,然后在该位置的前3位,插入,即可
    19. // int i = sb.lastIndexOf(".");
    20. // sb = sb.insert(i - 3, ",");
    21. //上面的两步需要做一个循环处理,才是正确的
    22. for (int i = sb.lastIndexOf(".") - 3; i > 0; i -= 3) {
    23. sb = sb.insert(i, ",");
    24. }
    25. System.out.println(sb);//8,123,564.59
    26. }
    27. }

    4.StringBuilder 类基本介绍

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

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

    1670249038353

    1. public class StringBuilder01 {
    2. public static void main(String[] args) {
    3. //老韩解读
    4. //1. StringBuilder 继承 AbstractStringBuilder 类
    5. //2. 实现了 Serializable ,说明StringBuilder对象是可以串行化(对象可以网络传输,可以保存到文件)
    6. //3. StringBuilder 是final类, 不能被继承
    7. //4. StringBuilder 对象字符序列仍然是存放在其父类 AbstractStringBuilder的 char[] value;
    8. // 因此,字符序列是堆中
    9. //5. StringBuilder 的方法,没有做互斥的处理,即没有synchronized 关键字,因此在单线程的情况下使用
    10. // StringBuilder
    11. StringBuilder stringBuilder = new StringBuilder();
    12. }
    13. }

    5.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

    6.String、StringBuffer 和 StringBuilder 的效率测试

    StringBuilder > StringBuffer > String

    1670249789915

    1. public class StringVsStringBufferVsStringBuilder {
    2. public static void main(String[] args) {
    3. long startTime = 0L;
    4. long endTime = 0L;
    5. StringBuffer buffer = new StringBuffer("");
    6. startTime = System.currentTimeMillis();
    7. for (int i = 0; i < 80000; i++) {//StringBuffer 拼接 20000次
    8. buffer.append(String.valueOf(i));
    9. }
    10. endTime = System.currentTimeMillis();
    11. System.out.println("StringBuffer的执行时间:" + (endTime - startTime));
    12. StringBuilder builder = new StringBuilder("");
    13. startTime = System.currentTimeMillis();
    14. for (int i = 0; i < 80000; i++) {//StringBuilder 拼接 20000次
    15. builder.append(String.valueOf(i));
    16. }
    17. endTime = System.currentTimeMillis();
    18. System.out.println("StringBuilder的执行时间:" + (endTime - startTime));
    19. String text = "";
    20. startTime = System.currentTimeMillis();
    21. for (int i = 0; i < 80000; i++) {//String 拼接 20000
    22. text = text + i;
    23. }
    24. endTime = System.currentTimeMillis();
    25. System.out.println("String的执行时间:" + (endTime - startTime));
    26. }
    27. }

    7.String、StringBuffer 和 StringBuilder 的选择

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

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

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

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

    StringBuilder的方法使用和 StringBuffer 一样,不再说

  • 相关阅读:
    ORACLE 知识梳理(持续更新)
    Kubernetes 中 RBAC、ServiceAccount 的区别和联系
    戴好这六顶帽子的项目经理,无论项目团队还是个人成长都受益终生
    Redis解决数据一致性方案
    java计算机毕业设计springboot+vue专业手语翻译预约系统
    1.3 矩阵
    电容笔和触屏笔一样吗?Ipad高性价比电容笔排行
    使用 Powershell 检索不理解的命令
    @PathVariable注解的简单使用,常用于restful传参
    云HIS系统源码,医院管理系信息统源码,融合B/S版四级电子病历系统
  • 原文地址:https://blog.csdn.net/m0_57385165/article/details/128194995