StringBuffer和StringBuilder

StringBuffer和StringBuilder

StringBuffer概述

我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间,而StringBuffer就可以解决这个问题。

string;StringBuffer和StringBuilder的区别

首先,都是用来代表字符串。

String类是不可变类,任何对String的改变都会引发新的String对象的生成

StringBuffer是可变的类,任何对他所指代的字符串都不会产生新的对象。

下面主要介绍StringBuffer和StringBuilder的区别

  • 线程安全

    StringBuffer:线程安全。StringBuilder:线程不安全。

    因为StringBuffer的所有公开方法都是synchronized修饰的,而StringBuilder并没有被修饰。

  • 缓冲区

    StringBuffer代码片段:

    private transient char[] toStringCache;
    
    @Override
    public synchronized String toString() {
        if(toStringCache == null){
            toStringCache = Arrays.copyOfRange(value,0,count);
        }
        return new String(toStringCache,true);
    }
    

    StringBuilder代码片段:

    @Override
    public String toString() {
       
        return new String(value,0,count);
    }
    

    StringBuffer每次获取toString都会直接使用缓冲区的toStringCache值来构造一个字符串。

    而StringBuilder则每次都需要复制一次字符数组,再构造一个字符串。

    所以,缓冲区也是对StringBuffer的一个优化,不过StringBuffer的这个toString方法仍然是同步的。

  • 性能

  • 既然StringBuffer是线程安全的,他的所有公开方法都是同步的,StringBuilder是没有对方法加同步锁的,所以,StringBuilder的性能要远大于StringBuilder。

区别总结

String:是字符常量,适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

功能概述

添加功能
public StringBuffer append(String str)
public StringBuffer insert(int offset,String str)
删除功能
public StringBuffer deleteCharAt(int index)
public StringBuffer delete(int start,int end)
替换功能
public StringBuffer replace(int start,int end,String str)
反转功能
public StringBuffer reverse()

截取功能
public String substring(int start)
public String substring(int start,int end)
截取功能和前面几个功能的不同
返回值类型是String类型,本身没有发生改变

代码演示
public class StringBufferDemo {
    public static void main(String[] args) {
        StringBuffer s1 = new StringBuffer();//默认长度16  char数组
        StringBuffer s2 = new StringBuffer("abcdefg");//内容长度+16

                     s2.append(1);//向末尾添加字符串,不会创建新的StringBuffer对象
                     s2.append("bbb");

                     s2.insert(1,"xxxxx");//从指定位置插入指定的字符串
                     s2.deleteCharAt(0);//删除指定位置上的字符,在原字符上操作,不会返回新的
        System.out.println(s2);
                     s2.delete(0,4);//删除指定区间的字符串,包含开始,不包含结束
        System.out.println(s2);
                     s2.replace(0,5,"asdf");//替换指定区间字符串
        StringBuffer s3 = new StringBuffer("abdasdj");
                     s3.reverse();//字符反转
        System.out.println(s3);
        System.out.println(s3.substring(0,3));//截取功能
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值