可变字符串(StringBuffer和StringBuilder)

本文探讨了Java中String、StringBuffer和StringBuilder的区别。String是不可变的,而StringBuffer和StringBuilder则是可变的,允许在不创建新对象的情况下进行修改。StringBuffer是线程安全的,适合多线程环境,而StringBuilder在单线程环境中效率更高。在大量字符串拼接时,根据线程安全需求选择合适的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.(StringBuffer类):

由于字符串String是常量,一旦被创建,其内容和长度不可被修改。如果需要对一个字符串进行修改,只能创建新的字符串。为了对字符串进行修改,Java提供了一个StringBuffer类(字符缓冲区)。StringBuffer类和String类的最大区别在于它的长度和内容都是可以改变的。StringBuffer类似于一个字符容器,当在其中添加或删除字符时,所操作的都是这个字符容器,不会产生新的StringBuffer对象。

StringBuffer类常用方法
增:StringBuffer append(XXX)添加XXX到StringBuffer对象中
删一个字符:StringBuffer deleteCharAt(int index)删除下标为index处的字符
删一段字符或字符串序列:StringBuffer delete(int start,int end)删除下标以start开始,end-1结尾处的字符串序列(包头不包尾)
改一个字符:void setCharAt(int index,char c)用字符c替换下标为index处的字符
改一个字符串:StringBuffer replace(int start,int end,String newStr)将指定范围的字符串替换成newStr(包头不包尾)
插字符串:StringBuffer insert(int start,XXX)将XXX插入到下标为start的前面
String toString( )返回StringBufffer缓冲区中的字符串
StringBuffer reverse()反转字符串序列

 

StringBuffer类的构造方法
StringBuffer()空的可变序列
StringBuffer(String str)根据指定字符串创建可变序列
package StringBuffer和StringBuilder;

public class Demo1 {
    public static void main(String[] args) {
        StringBuilder sb=new StringBuilder("abcd");
        sb.append(true);
        System.out.println(sb);
        sb.delete(2,5);//删除的2 3 4 下标的字符
        System.out.println(sb);
        sb.setCharAt(0,'F');
        System.out.println(sb);
        sb.replace(2,5,"ooo");
        System.out.println(sb);
        sb.insert(1,"mm");
        System.out.println(sb);
    }
}

 二(StringBuilder类):

StringBuilder类是JDK5中新加的类,和StringBuffer之间的区别在于:StringBuilder的方法是线程不安全的,即StringBuffer不能被同步访问,而StringBuilderr可以同步访问。StringBuilder类的常见操作和StringBuffer类似,可以参考上面的StringBuffer类。

三(String类,StringBuffer类和StringBuilder类之间的效率测试):

package day1113;
/*
String StringBuffer StringBuilder效率对比
      使用三个不同类型对字符串进行拼接
      频繁对字符串进行增删改插操作的时候使用StringBuilder

 */
public class StringDemo02 {
    public static void main(String[] args) {
        /*
         String效率测试
        使用String拼接数字到200000
         */
        long startTime=0;
        long endTime=0;
        String s1="";
        //获取系统时间|:System.currentTimeMillis()---获取当前系统的毫秒值
        startTime=System.currentTimeMillis();
        for (int i=1;i<=200000;i++){
            s1=s1+i;//字符串的拼接
        }
        endTime=System.currentTimeMillis();
        System.out.println("使用String拼接数字1到200000花了"+(endTime-startTime)+"毫秒!");

        /*
        StringBuffer效率测试
         使用StringBuffer拼接数字1-200000
         */
        StringBuffer sb1=new StringBuffer("");
        startTime=System.currentTimeMillis();
        for (int i=1;i<=200000;i++){
           sb1.append(String.valueOf(i));//把i变成String然后再拼接
        }
        endTime=System.currentTimeMillis();
        System.out.println("使用StringBuffer拼接数字1到200000花了"+(endTime-startTime)+"毫秒!");

        /*
        StringBuilder效率测试
            使用StringBuilder拼接数字1-200000
         */
        StringBuilder sb2=new StringBuilder("");
        startTime=System.currentTimeMillis();
        for (int i=1;i<=200000;i++){
            sb2.append(String.valueOf(i));//把i变成String然后再拼接
        }
        endTime=System.currentTimeMillis();
        System.out.println("使用StringBuilder拼接数字1到200000花了"+(endTime-startTime)+"毫秒!");

    }
}

从最终结果可看出,三者的工作效率为:StringBuilder>StringBuffer>String 

四(StringBuffer和StringBuilder间的线程安全性与工作效率性对比):

StringBufferStringBuilder
方法采用了加锁,线程安全方法没有采用加锁,线程不安全
工作效率低工作效率高

五(String类,StringBuffer类和Stringbuilder类之间的不同之处):

1.String类表示的字符串是常量,一旦创建后,内容和长度都是无法改变的。而StringBuffer类和StringBuilder类表示字符容器,其内容和长度都可以改变。在操作字符串时,如果该字符串仅用于表示数据类型,则使用String类即可;如果需要对字符串中的字符进行添加或删除时,则应使用StringBuffer类或StringBuilder类;如果有大量字符串拼接操作时,在不要求线程安全的前提下,采用StringBuilder类更高效;若需要保证线程安全,则使用StringBuffer类。

2.String类重写了Object类的equals()方法,而StringBuffer类和StringBuilder类都没有重写Object类的equals()方法。

package StringBuffer和StringBuilder;

public class Demo3 {
    public static void main(String[] args) {
        String str1=new String("abc");
        String str2=new String("abc");
        boolean result=str1.equals(str2);
        System.out.println("String中str1和str2:"+result);
        StringBuffer str3=new StringBuffer("abc");
        StringBuffer str4=new StringBuffer("abc");
        boolean result1=str3.equals(str4);
        System.out.println("StringBuffer中str3和str4:"+result1);
        StringBuilder str5=new StringBuilder("abc");
        StringBuilder str6=new StringBuilder("abc");
        boolean result2=str5.equals(str6);
        System.out.println("StringBuilder中str5和str6:"+result2);
    }
}

 

 3.String类对象可以用操作符“+”进行拼接,而StringBuffer类对象和StringBuilder类对象不能用操作符“+”进行拼接。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值