【零基础学Java】第十九篇 包装类2(StringBuffer,StringBuilder)

本文详细介绍了Java中的String、StringBuffer和StringBuilder类,包括它们的结构、特点、转换方法以及常用操作。重点对比了String的不可变性和StringBuffer、StringBuilder在可变操作上的效率差异,特别指出在多线程和单线程环境下如何选择合适的数据类型。同时,提供了实例代码演示各种操作,帮助读者深入理解。
摘要由CSDN通过智能技术生成

📄个人简介
🔔作者简介:大家好,我是小学生!!🙈大三学生一枚,目前正在自学Java,如果大家觉得我写的还不错的话,希望大家给我点赞👍+收藏⭐+评论📢,有什么写的不对的地方还请大家多多指教🙏,共同进步。
📝个人主页:小学生!!
📖系列专栏
🌕阶段一:Java基础编程
💦目前已原创19篇

🌕阶段二:数据结构与算法
🌕阶段三:操作系统
🌕阶段四:计算机网络

1.StringBuffer类
1.StringBuffer类的结构剖析
  1. StringBuffer 的直接父类 是 AbstractStringBuilder
  2. StringBuffer 实现了 Serializable, 即StringBuffer的对象可以串行化
  3. 在父类中 AbstractStringBuilder 有属性 char[] value,不是final该 value 数组存放 字符串内容,引出存放在堆中的
  4. StringBuffer 是一个 final类,不能被继承
  5. 因为StringBuffer字符内容是存在 char[] value, 所以在变化(增加/删除)时不用每次都更换地址(即不是每次创建新对象), 所以效率高于 String。
2.String类 VS StringBuffer类
  1. String保存的是字符串常量,里面的之可以更改,每次String类的更新实际上就是更改地址,效率很低//private final char value[];
  2. StringBuffer保存的是字符串变量,里面的之可以更改,每次StringBuffer的更新只是更新内容,不用每次更新地址,效率较高。//char[] value;在堆中
3.String和StringBuffer的转换
public class StringAndStringBuffer {
    public static void main(String[] args) {

        //String——>StringBuffer
        String str = "hello tom";
        //方式1 使用构造器
        //返回的是StringBuffer对象,对str本身没有影响
        StringBuffer stringBuffer = new StringBuffer(str);
        //方式2 使用的是append方法
        StringBuffer stringBuffer1 = new StringBuffer();
        stringBuffer1 = stringBuffer1.append(str);

        // StringBuffer-->String
        StringBuffer stringBuffer3 = new StringBuffer("韩顺平教育");
        //方式1 使用StringBuffer提供的 toString方法
        String s = stringBuffer3.toString();
        //方式2: 使用构造器来搞定
        String s1 = new String(stringBuffer3);

    }
}
4.StringBuffer类的常见方法
  1. append:在字符串的后面加字符串。
  2. delete(start,end):删除索引>=start && <end处的字符,前闭后开 [start,end)。
  3. replace(start,end,str):将start----end间的内容替换成str,前闭后开 [start,end)。
  4. indexOf :查找子串在字符串第1次出现的索引,如果找不到返回-1
  5. insert:在字符串中插入其后面的字符向后移。
  6. length:获取字符串长度。
public class StringBufferMethod {
    public static void main(String[] args) {

        StringBuffer s = new StringBuffer("hello");
        //1.在字符串的后面加字符串
        s.append(',');// "hello,"
        s.append("张三丰");//"hello,张三丰"
        s.append("赵敏").append(100).append(true).append(10.5);//"hello,张三丰赵敏100true10.5"
        System.out.println(s);//"hello,张三丰赵敏100true10.5"
        /*
         * 2.删除索引为>=start && <end 处的字符,前闭后开 [start,end)。
         */
        s.delete(11, 14);
        System.out.println(s);//"hello,张三丰赵敏true10.5"
        //3.将start----end间的内容替换成str,前闭后开  [start,end)。
        s.replace(9, 11, "周芷若");
        System.out.println(s);//"hello,张三丰周芷若true10.5"
        //4.查找指定的子串在字符串第一次出现的索引,如果找不到返回-1
        int indexOf = s.indexOf("张三丰");
        System.out.println(indexOf);//6
        //5.在字符串中插入其后面的字符向后移
        //在索引为9的位置插入 "赵敏",原来索引为9的内容自动后移
        s.insert(9, "赵敏");
        System.out.println(s);//"hello,张三丰赵敏周芷若true10.5"
        //6.获取字符串长度
        System.out.println(s.length());//22
        System.out.println(s);

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学生!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值