【String类】StringBuffer类 StringBuilder类

1.java.lang.StringBuffer代表可变字符序列,可以对字符串内容进行删减。

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

StringBuffer是一个容器

package com.cn.stringbuffer;

/**
 * @author xxx
 * @version 1.0
 */
public class StringBuffer01 {
    public static void main(String[] args) {
        //1. StringBuffer直接父类是AbstractStringBuilder
        //2.StringBuffer实现了Serializable,即StringBuffer的对象可以串行化
        //3.在父类中 AbstractStringBuilder 有属性 char[] value,不是final
        //该 value 数组存放在字符串内容,引出存放在堆中
        //4.StringBuffer 是一个final类,不能被继承
        //5.因为StringBuffer 字符内容是存在 char[] value,所有在变化(增加或删除)
        //不用每次都更滑地址(即 不是每次创建新对象),所以效率高于String
        StringBuffer stringBuffer = new StringBuffer("hello");
    }
}

2.String VS StringBuffer

1)String保存的是字符串常量,里面的值不能更改,每次String类的更新实际就是更新地址,效率较低,

//private final char[] value;

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

3.String 和 StringBuffer 相互转换

package com.cn.stringbuffer;

/**
 * @author xxx
 * @version 1.0
 */
public class StringBuffer02 {
    public static void main(String[] args) {
        String str = "hello";
        //String -> StringBuffer
        //方式一 使用构造器
        //注意:返回才是StringBuffer 对象,对str本身没有影响
        StringBuffer stringBuffer1 = new StringBuffer(str);
        System.out.println(stringBuffer1);

        //方式二  使用的是append方法
        StringBuffer stringBuffer2= new StringBuffer();
        stringBuffer2 = stringBuffer2.append(str);
        System.out.println(stringBuffer2);

        //StringBuffer -> String
        //方式一 使用toString方法
        StringBuffer stringbuffer3= new StringBuffer("安子轩");
        String s = stringbuffer3.toString();
        System.out.println(s);

        //方式二 使用构造器
        String s1 = new String(stringbuffer3);
        System.out.println(s1);



    }
}

4.StringBuffer 类的常见方法

package com.cn.stringbuffer;

/**
 * @author xxx
 * @version 1.0
 */
public class StringBuffer03 {
    public static void main(String[] args) {
        StringBuffer s = new StringBuffer("hello");
        //增加
        s.append(',');//hello,
        s.append(100);//hello110
        s.append("你好").append(100).append('男');//hello 你好 100 男
        System.out.println(s);

        //删除
        /*
          删除所以为 >= start && < end 处的字符
          解读:   删除 6~9的字符 [6 ,9 )
         */
        s.delete(6,9);
        System.out.println(s);//hello,你好100男

        //替换
        //解读:使用 安子轩 替换 索引 6~8 的字符 [6 ,8)

        s.replace(6,8,"安子轩");
        System.out.println(s);//hello,安子轩100男
        //查找指定的子串在字符串第一个出现的索引,如果找不到返回-1
        int indexOf = s.indexOf("安子轩");
        System.out.println(indexOf);//6

        // 插入
        //在索引为6的位置 插入"jack",原来索引为9的内容自动后移
        s.insert(6,"jack");
        System.out.println(s);//hello,jack安子轩100男

        System.out.println(s.length());//17

    }
}

bbd57830eda34ab7b974bd0bc4cdd48d.png

5.1StringBuffer测试题1

package com.cn.stringbuffer;

/**
 * @author xxx
 * @version 1.0
 */
public class StringBuffer04 {
    public static void main(String[] args) {
        String str = null;
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(str);//需要看底层源码 AbstractStringBuilder append

        System.out.println(stringBuffer.length());//4
        System.out.println(stringBuffer);//null


        //下面会抛出空指针异常 NullPointerException

        StringBuffer stringBuffer1 = new StringBuffer(str);//看底层源码 super(str.length() + 16);
        System.out.println(stringBuffer1);
    }
}

5e752fd2ab2b49398baf4b0d971e6e16.png

 5.2StringBuffer测试题2

package com.cn.stringbuffer;

/**
 * @author xxx
 * @version 1.0
 */
public class StringBuffer05 {
    public static void main(String[] args) {
        //输出商品名称和商品价格,要求打印效果,使用我们前面学习的方法完成
        //商品名 商品价格
        //手机 123,654.59  要求:价格的小数点前面三位用逗号隔开
        String pice = "1236545.59";
        StringBuffer stringBuffer = new StringBuffer(pice);
       // int i = stringBuffer.lastIndexOf(".");
      //  stringBuffer = stringBuffer.insert(i-3,",");

        for (int i = stringBuffer.lastIndexOf(".")-3; i > 0;i-=3){
            stringBuffer = stringBuffer.insert(i,",");

        }
        System.out.println(stringBuffer);
    }
}

aa666fd3af8b4505a43116e273f6ffb9.png

 

6.StringBuilder基本介绍 

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

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

package com.cn.stringbuilder_;

/**
 * @author xxx
 * @version 1.0
 */
public class StringBuilder01 {
    public static void main(String[] args) {
        //解读
        //1.StringBuilder 的直接父类 AbstractStringBulider
        //2.StringBuilder 实现了Serializable 即StringBuilder的对象可以串行化
        //3.在父类中 AbstractStringBulider 有属性 char[] value ,不是final
        //该value 数组存放 字符串内容,引出存放在堆中的
        //4.Stringbuilder 是一个final类 不能被继承
        //5.因为StringBuilder 字符内容是存放在 char[] value,所以在变化【增加/删除】
        //不用每次都更换地址【即不是哦每次创建新对象】,所以效率高于String

        StringBuilder hello = new StringBuilder("hello");
    }
}

//1. StringBuilder 继承 AbstractStringBuilder 类

//2. 实现了 Serializable ,说明 StringBuilder 对象是可以串行化(对象可以网络传输,可以保存到文件)

//3. StringBuilder 是 final 类, 不能被继承

//4. StringBuilder 对象字符序列仍然是存放在其父类 AbstractStringBuilder 的 char[] value;

//因此,字符序列是堆中

//5. StringBuilder 的方法,没有做互斥的处理,即没有 synchronized 关键字,

//因此在单线程的情况下使用

//StringBuilder

 

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

2.String StringBuffer 和 StringBuilder选择

使用原则,

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

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

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

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

 

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

晓明学Java

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

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

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

打赏作者

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

抵扣说明:

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

余额充值