StringBuilder和StringBuffer的区别

          由于String的不可更改特性,为了方便字符串的修改,java中又提供了StringBuilder类和StringBuffer类。

一、StringBuffer类

StringBuffer的应用

StringBuffer在字符串的操作上克服了String拼接会产生多个对象的问题。它可以以一个字符串作为参数进行初始化。其常用初始化方式有如下三种:

StringBuffer strBuffer=new StringBuffer();             //无参构造函数初始化

StringBuffer stringBuffer=new  StringBuffer("123");   //使用字符串对象初始化

StringBuffer  stBuffer=new StringBuffer("strBuffer");  //使用另一个StringBuffer对象初始化

1. 字符串拼接插入

StringBuffer只要使用append()方法进行字符串的拼接操作,同时,也可以使用insert()方法有针对性地进行插入。在操作完成之后,可以使用toString方法返回字符串对象。

public class MyStringBuffer {
    //StringBuffer的字符串拼接插入
    public static void main(String[] args) {
        StringBuffer stringBuffer = new StringBuffer("Hello");  //初始化StringBuffer对象
        System.out.println(stringBuffer);
        //追加操作
        stringBuffer.append("  StringBuffer!");
        System.out.println(stringBuffer);

        //插入操作
        stringBuffer.insert(6,"Java");   //在索引6位置插入字符
        System.out.println(stringBuffer);
    }
}


//运行结果
//Hello
//Hello  StringBuffer!
//Hello Java StringBuffer!

       StringBuffer的append()方法可以追加任何类型的值,并将之转换成字符串添加到StringBuffer对象的末尾。StringBuffer将boolean类型的变量的值当成是字面量追加到末尾,而其他类型则当成一个字符进行追加。

      StringBuffer的insert方法可以在指定位置插入传入的值,insert也会将boolean类型的变量以字面量值插入到指定索引位置,该索引位置的值依次向后移动。

2.字符串修改

       相较于字符串类,StringBuffer不仅可以拼接字符串或者在特定的位置插入字符串,还可以删除指定索引上的字符。

public class MyStringBuffer {

    //StringBuffer的常用操作方法
    public static void main(String[] args) {
        StringBuffer stringBuffer=new StringBuffer();
        stringBuffer.append("The StringBuffer Search Demo.");    //给StringBuffer添加数据
        System.out.println(stringBuffer);

        System.out.println(stringBuffer.charAt(4));    //输出索引4位置上的数
        System.out.println(stringBuffer.indexOf("Search"));    //输出Search字符串的索引位置
        System.out.println(stringBuffer.indexOf("S",9));    //从索引位置9开始寻找下一个S搜在的索引位置
        System.out.println(stringBuffer.delete(4,16));    //删除索引4到索引16位置上的字符
        System.out.println(stringBuffer.deleteCharAt(2));  //删除索引位置7上的字符
        System.out.println(stringBuffer.lastIndexOf("e"));  //输出最后一个e的索引
        System.out.println(stringBuffer.replace(0,2,"What a"));   //用What a代替索引位置0-2上的元素
        System.out.println(stringBuffer.reverse());      //将StringBuffer内的数据进行反转
        System.out.println(stringBuffer);
    }


//运行结果
//The StringBuffer Search Demo.
//S
//17
//17
//The  Search Demo.
//Th  Search Demo.
//12
//What a  Search Demo.
//.omeD hcraeS  a tahW
//.omeD hcraeS  a tahW

       StringBuffer中的delete方法能够很灵活地删除字符串中的数据,配合insert()方法可以快速实现字符串的修改操作。从输出结果可以看出,StringBuffer对象的修改是持久的。StringBuffer不仅可以很灵活的找到、删除、输出某个指定索引位置的值,还可以很好的实现用某个字符串替换原有的字符串。

      但是,StringBuffer对于字符串的操作是“含头不含尾”的处理方式。在替换索引位置0-2的操作里,只替换了索引位置0-1的元素。

二、StringBuilder类

StringBuilder也是官方API中设计的用来操作字符串的方法类,下面让我们通过这个代码一起学习一下吧!

public class MyStringBuilder {

    public static void main(String[] args) {
        StringBuilder stringBuilder=new StringBuilder();    //初始化一个StringBuilder对象
        stringBuilder.append("Hello Java StringBuilder!");    //在末尾追加字符串

        System.out.println(stringBuilder.append("!!"));    //追加字符!!
        System.out.println(stringBuilder.indexOf("Java"));   //打印Java第一次出现的索引位置
        System.out.println(stringBuilder.delete(6,10));      //删除索引位置6-10的元素
        System.out.println(stringBuilder.reverse());         //将StringBuilder里的元素反转
        System.out.println(stringBuilder.deleteCharAt(0));    //删除0号索引位置上的元素
        System.out.println(stringBuilder);
    }
}

//运行结果:
//Hello Java StringBuilder!!!
//6
//Hello  StringBuilder!!!
//!!!redliuBgnirtS  olleH
//!!redliuBgnirtS  olleH
//!!redliuBgnirtS  olleH

     从上面的代码以及运行结果可以看出,StringBuffer和StringBuilder在一些常用方法上几乎一致,既然功能相同,那为什么要设置两个类呢?

 三、StringBuilder和StringBuffer的区别

       StringBuffer是多线程(可以理解为一个跑道就是一个线程,多个选手同时在多个跑道比赛就相当于多线程场景)的,StringBuffer采用同步处理,属于线程安全操作,而StringBuilder未采用同步处理,属于线程不安全操作。在编写程序时如果不需要考虑多线程环境,那么就用StringBuilder,因为无需考虑多线程时,不需要担心选手是否会进错跑道,速度就会快一些。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值