String、StringBuffer、StringBuilder的区别

区别部分介绍:

介绍:

String 是java中的字符串,用来创建和操作字符串。

StringBuffer和StringBuilder,对字符串进行修改时会用到。

相同点:

三者都是final类,不能再被继承。

最主要的区别:

主要在 运行效率 和 线程安全 这两方面。

运行效率来说:

StringBuilder > StringBuffer > String 

主要原因是:

        String是不可变类,即字符串常量,每次对String对象的修改都是创建新对象,所以其是最慢的;StringBuffer和StringBuilder则是可变类,即字符串变量,他们的对象在进行修改时不会产生新的对象。

那为什么StringBuilder会比StringBuffer快呢?看下面的线程安全。

线程安全来说:

StringBuffer是线程安全的,支持并发操作,很多方法都含有 synchronized 关键字;相反StringBuilder并未含有该关键字,并不支持多线程,保证不了线程安全。

回答上面的运行效率原因,因为StringBuffer支持多线程操作,所以相对单线程的StringBuilder来说会慢一些,所以在单线程情况下推荐使用StringBuilder。

演示案例:

定义三个对象,都是abc,同时加100000次de,看一下运行时间。

public static void main(String[] args) {
        //String
        String str = "abc";

        long startTime = System.currentTimeMillis();
        for(int i = 0; i<100000;i++){
            str += "de";
        }
        long endTime = System.currentTimeMillis();
        System.out.println("String的耗时为"+ (endTime - startTime));

        //StringBuffer
        StringBuffer stringBuffer = new StringBuffer("abc");
        startTime = System.currentTimeMillis();
        for (int i = 0; i<100000; i++){
            stringBuffer.append("de");
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuffer的耗时为"+ (endTime - startTime));

        //StringBuilder
        StringBuilder stringBuilder = new StringBuilder("abc");
        startTime = System.currentTimeMillis();
        for (int i = 0; i<100000; i++){
            stringBuilder.append("de");
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuilder的耗时为"+ (endTime - startTime));
    }

String的耗时为20225
StringBuffer的耗时为5
StringBuilder的耗时为2

 最终结果是如此,由此可见,其耗时之间的差距。

总结:

        1. 少量字符时可以用String类,但是在大量字符需要进行修改时,建议使用StringBuffer或StringBuilder;

        2. 在使用多线程的时候,建议使用StringBuffer,它支持多线程;

        3. 在单线程情况下,建议是用StringBuilder

常用方法介绍:

在使用StringBuffer时其内是有很多方法的,在此进行常用的几个的介绍。

StringBuffer stringBuffer = new StringBuffer("abc");

1. append 方法

功能:进行字符串连接,将制定字符拼接到最后

写法:stringBuffer.append("de");

效果:字符串变为 "abcde"

2. insert 方法

功能:在指定对象字符串中插入指定内容

写法:stringBuffer.insert(1,"de");

效果:字符串变为 "adebc"

3. delete 方法

功能:删除从开始位置到结束位置的内容(包括开头,不包括结尾)

写法:stringBuffer.delete(0,2);

效果:字符串变为 "c"

4. deleteCharAt 方法

功能:删除指定位置的字符

写法:stringBuffer.insert(1);

效果:字符串变为 "ac"

5. reverse 方法

功能:将字符串内容进行反转

写法:stringBuffer.reverse();

效果:字符串变为 "cba"

6. subString 方法

功能:将选定位置区间内字符串截取返回一个新字符串(包括开头,不包括结尾,只提供一个默认为开始到结束)

写法:stringBuffer.subString(1); ||  stringBuffer.subString(1,2);

效果:返回字符串 "bc"  || "b"

7. charAt 方法

功能:将字符串指定位置的字符返回出来(注意是返回的字符类型)

写法:stringBuffer.charAt(1);

效果:返回 'b'

8. setCharAt 方法

功能:将指定位置设置成指定字符

写法:stringBuffer.setCharAt(1,'d');

效果:字符串变为 "adc"

9. indexOf 方法 (相反的方法 lastIndexOf )

功能:返回指定字符串出现的第一次下标位置

写法:stringBuffer.indexOf("b");

效果:返回 1

10. replace 方法

功能:将指定区间内字符串替换为指定字符串(包含开头,不包含结尾)

写法:stringBuffer.replace(0,1,"de");

效果:字符串变为 "debc"

11. length 方法

功能:返回字符串长度

写法:stringBuffer.length();

效果:返回 3

综上11个方法是个人用的比较多的一些方法,一般情况下足够满足很多操作了已经,省去很多麻烦的中间过程可以。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值