Java学习记录,关于String类型的StringBuffer和StringBuilder

StringBuffer类:

package Changyong;
/*buffer有缓冲的意思
    -字符串不可变,但是字符串缓冲区支持字符串改变
 *StringBuffer:缓冲区字符串,可以改变
    —char[] value 默认大小为:16,装满之后可以扩容
        -只需要改变数组地址即可,不需要创建新的StringBuffer对象
*/
public class StringBufferDemo {
    public static void main(String[] args) {
        /*
        String s="a";//a 10 final char[] value
            —这里的数组是被final修饰的,是属于不可改变的
        s+="a";//aa 11
        */
        //StringBuffer的三种构造方法
        StringBuffer s=new StringBuffer();//默认容量为16
        StringBuffer s_1=new StringBuffer("abc");//容量为字符串长度+16
        StringBuffer s_2=new StringBuffer(32);//容量为指定容量
        //给StringBuffer添加东西:append
        s.append("abc");
        s.append("efg");
        System.out.println(s);
        /*
        * 上述操作创建了几个对象?
        *   -一个,即使值发生了改变,他始终都只有一个对象,源码返回时返回的this
        */

        //继续添加内容,直到多出容量
        s.append("hijk");
        s.append("lmn");
        //长度变为34,因为源码定义扩充方式为:长度*2+2   34

        /*
            //再次添加到超过34
            s.append("qazwsxedcrfvtgbyhnujmikolpplomkinjubhyvgtcfredx");
            //得出数组长度扩充到60
        */
        s.append("qazwsxedcrfvtgbyhnujmikolpplomkinjubhyvgtc");
        //得出数组扩充到55
    }
}

StringBuffer类的功能:

package Changyong;

public class StringBufferDemo2 {
    public static void main(String[] args) {
        StringBuffer s=new StringBuffer();//默认容量为16

        //添加功能
        s.append("abc");
        s.append("efg");//向末尾添加

        s.insert(2,"XXX");//在指定位置上插入字符串
        //abXXXcefg
        System.out.println(s);

        //删除功能
        s.deleteCharAt(2);//删除指定位置上的字符
        System.out.println(s);

        s.delete(3,5);
        System.out.println(s);//删除指定区间的内容,包含开始位置,但不包含结束的位置

        //替换功能
        s.replace(0,2,"KIJA");//替换指定区间的内容,但是不包含结束的位置
        System.out.println(s);

        //反转功能
        s.reverse();
        System.out.println(s);

        //截取功能
        String str=s.substring(2);//从第二个开始截取到结束,返回一个字符串副本
        System.out.println(str);

        String str_1=s.substring(0,2);//截取一段指定区间,但是不包含结束位置
        System.out.println(str_1);
    }
}

StringBuilder类:

package Changyong;

public class StringBuilderDemo {
    public static void main(String[] args) {
        /*
        *   大部分功能与StringBuffer的功能一样
        *   也是一样大部分实现都是直接调用的父类的方法
        *
        *   两个子类实现方式一致,多以都调用的是父类中的方法
        *   所以不同的东西,就在子类
        */
        StringBuilder s=new StringBuilder();
        s.append("rqew");
        /*  buffer的append中由关键字修饰:
                -所有的append都添加了同步关键字的修饰
            builder中都没有:
                -这个东西牵扯到线程问题:
                    -如果加了synchronized修饰,一次只能由一个请求进入到方法里进行处理
                    如果没有添加synchronized进行修饰,在多线程中就可以都进去进行处理
                    比如遇到了抢票取钱这类问题,如果同时进去可能会导致报错
                -也就是说这个玩意儿不适合多用户,只适合单用户
            String:
                -值不可以改变,一旦值改变就会创建新的String对象
        */
        s.insert(2,"asji");
        s.reverse();

    }
}

StringBuffer和StringBuilder类的异同:

        正如上面所讲,StringBuffer和StringBuilder两个类都继承自AbstractStringBuilder,他们大部分的功能都直接继承自父类,所以乍一看这两个子类都很像,但当我们进入源码查看的时候才会发现有不同的地方:

//StringBuffer的append:
    @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }
//StringBuilder的append;
    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }

上图是StringBuffer和StringBuilder的append方法的源码:

        在这里我们发现Buffer的方法前被synchronized关键词修饰,这个是同步关键词修饰,在使用了这个关键词修饰之后,Buffer的方法在进行的时候只能一次只能进行一个请求,无法进行多个请求,在某些时候这个方法会起到很大的保护作用,但目前而言我们无法太深入的理解什么是线程,所以在这里简单的总结就是:Buffer适合单用户,而Builder适合多用户的运行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值