栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

String、StringBuffer、StringBuilder的区别

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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个方法是个人用的比较多的一些方法,一般情况下足够满足很多操作了已经,省去很多麻烦的中间过程可以。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/645015.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号