【JavaSE】StingBuffer、StringBuilder的使用

写在前面

本文为 StringBuilder、StingBuffer 的笔记
自学java第…天
常常是最后一把钥匙打开了沈殿门,不要失去信心,只要坚持不懈,就终会有结果的 加油,陌生人

在这里插入图片描述

一、StringBuffer

1.StringBuffer 的父类是 abstractStringBuilder
2.StriBuffer 实现了 Serializable,即可以串行化
3.在父类 abstractStringBuilder 有属性 char[] value,不是 final该 value 数组存放字符串内容,存放在堆中
4.StringBuffer 是一个 final 类,不能被继承
5.StringBuffer 字符内容存放在 char[] value,所有变化不用每次都更换地址,效率高于 STring

StringBuffer 常用构造器

1.StringBuffer():构造一个其中不带字符的字符串缓冲区,初始容量为16个字符
2.StringBuffer(int capacity) // capacity:容量
构造一个不带字符,但具有指定初始容量的字符缓冲区,即对 char[] 大小进行指定
3.StringBuffer(String str):构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容

    public static void main(String[] args) {
        // 1.StringBuffer():构造一个其中不带字符的字符串缓冲区,初始容量为16个字符
        new StringBuffer();
        // 2.StringBuffer(int capacity) // capacity:容量
        //   构造一个不带字符,但具有指定初始容量的字符缓冲区,即对 char[] 大小进行指定
        new StringBuffer(180);

        // 3.StringBuffer(String str):构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容
        new StringBuffer("hello"); // 5 + 16 = 21
    }

String 和 StringBuffer 相互转换

String 转 StringBuffer

    public static void main(String[] args) {
        // 方式一:使用构造器
        // 注意:返回的才是 StringBuffer,对 str 本身没有影响
        String str = "hello,World!";
        StringBuffer stringBuffer = new StringBuffer(str);
        //方式二:使用 append 方法
        StringBuffer stringBuffer1 = new StringBuffer();
        stringBuffer1.append(str);
    }

StringBuffer 转 String

public static void main(String[] args){
        StringBuffer string1 = new StringBuffer("Java");
        // 方式一:使用 toString
        String str01 = string1.toString();
        // 方式二:使用构造器
        String str02 = new String(string1);
}

StringBuffer 常用方法

***1.append:增
2.delete(start,end):删除
3.replace(start,end,String):改,将 start ~ end 间的内容替换成 String,不包含 end
4.indexOf:查:查找子串在字符串第一次出现的索引,如果找不到返回 -1
5.insert:插
6.length:获取长度

	public static void main(String[] args){
        StringBuffer s = new StringBuffer("hello");
        // append:增,
        s.append(",Java");// hello,Java
        s.append(",C").append(",C++").append(",Go");// hello,Java,C,C++,Go
        System.out.println(s);// hello,Java,C,C++,Go
        // delete(start,end):删除
        // 删除索引为 10~16的字符 [10,16)
        s.delete(10,16);
        System.out.println(s); // hello,Java,Go
        // replace(start,end,String):改,将 start ~ end 间的内容替换成 String,不包含 end
        s.replace(6,10,"HTML"); // 将 Java 替换成 HTML
        System.out.println(s); // hello,HTML,Go
        // indexOf:查:查找子串在字符串第一次出现的索引,如果找不到返回 -1
        System.out.println(s.indexOf("HTML"));// 6
        // insert:插
        // 在 HTML 后插入一个 ,Python,其他内容往后
        s.insert(10,",Python");
        System.out.println(s);// hello,HTML,Python,Go
        //length:获取长度
        System.out.println(s.length());// 20
    }

StringBuffer 练习

题目:

在这里插入图片描述

个人思路分析:

1.创建 Scanner 对象,接收用户输入
2.将输入的价格转为 StringBuffer
3.使用 indexOf() 判断小数点位置
4.使用循环,从后往前:
               ~~~~~~~~~~~~~~               int i = index; i > 0; i–
5.判断 index 是否小于0,如果小于0结束插入,如果不小于,在 index - 3 的位置插入 ,号

个人代码实现

public static void main(String[] args) {
//         输入商品名称和商品价格,要求打印效果示例
//         商品名  商品价格
//         手机    123,456,789.59
//         要求:价格的小数点前面每三位使用逗号隔开,在输出
        /*
        思路分析
        1.创建 Scanner 对象,接收用户输入
        2.将输入的价格转为 StringBuffer
        3.使用 indexOf() 判断小数点位置
        4.使用循环,从后往前:
                    int i = index; i > 0; i--
        5.判断 index 是否小于0,如果小于0结束插入,如果不小于,在 index - 3 的位置插入 ,号
         */
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入商品名称:");
        String name = scanner.next();
        System.out.print("请输入价格:");
        String price = scanner.next();
        StringBuffer price_ = new StringBuffer(price); // 将价格转为 StringBuffer 类
        int index = price.indexOf("."); // 判断小数点在位置

        for (int i = index; i > 0; i--) { // 循环从后面往前插
            index -= 3; // 插入位置
            if (index <= 0) { // 是否小于0,如果小于0结束插入
                break;
            }
            price_.insert(index,",");
        }
        System.out.println(name + "\t" + price_);
    }

测试结果

在这里插入图片描述

老师思路

老师思路:
1.定义一个Scanner 对象,接收用户输入的价格(String)
2.希望使用到 StringBuffer的 insert,需要将 String 转为 StringBuffer
3.使用相关方法进行字符串处理

代码实现

        String price = "134567891.51";
        StringBuffer sb = new StringBuffer(price);
        for (int i = sb.lastIndexOf(".") - 3; i > 0; i -= 3) {
            sb.insert(i,",");
        }
        System.out.println(sb);

个人代码实现 VS 老师代码实现

老师代码比个人代码更优更简洁

二、StringBuilder

1.StringBuilder 继承了 abstractStringBuilder 类
2.实现了 serializable 接口,说明StringBuilder 对象可以串行化(对象可以网络传输,可以保存到本地)
3. StringBuilder 是 final 类,不能被继承
4.StringBuilder 对象字符序列仍是存放在父类 abstractStringBuilder 的 char[] value;因此字符序列是在堆中
5.StringBuilder 的方法没有做互斥的处理,即没有 synchronized 关键字,因此,在单线程的情况下使用 StringBuilder

三、String、StringBuffer、StringBuilder的选择

1.如果字符串存在大量的修改操作,一般使用StringBuffer或StringBuilder
2.如果字符串存在大量的修改操作,并在单线程的情况下,使用StringBuilder
3.如果字符串存在大量的修改操作,并在多线程的情况,使用StringBuffer
4.如果字符串很少修改,给多个对象引用,使用 String,比如配置信息等

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值