这一次我们来说说String和StringBuffer、StringBuilder的区别 !
发布日期:2021-06-30 11:38:10 浏览次数:2 分类:技术文章

本文共 3376 字,大约阅读时间需要 11 分钟。

又到了学习技术的时候了,千万不要懈怠,因为很多比你还优秀的人都还在努力学习呢!我之前听过非常有感触的一句话就是“以大多数人的努力程度之低,根本轮不到拼天赋”,说的非常有道理,你觉得呢?

今天我们一起来学习下

String和StringBuffer、StringBuilder的区别 !

庆哥: 来,咱今天继续来学习,看来大家都是爱学习的,也是哦,学习时间都不够了,哪有时间娱乐。

小白: 那咱们今天学习什么呢?

庆哥: 咱们今天来聊一下String和StringBuffer、StringBuilder的区别 !

小白: 你还别说,这三个家伙倒是经常见的,不过我发现在实际的编码中好像只用到过String啊,另外两个用到的比较少。

庆哥: 确实,这三个室友区别的,一般在咱们平常的学习编码中用String的还是比较多的,对于另外两个有他们各自使用的场景。

小白: 也就是说,他们都是环境下使用喽!

庆哥: 是的,在特定的场景下才能最大发挥各自的长处,也是物尽其用了,现在假如别人问你他们三者的区别。你会怎样回答呢?

小白:

在这里插入图片描述

庆哥: 哈哈,看来你不知道啊,那我就给你说说吧!首先必须记住这些

  1. String 字符串常量
  2. StringBuffer 字符串变量(线程安全)
  3. StringBuilder 字符串变量(非线程安全)

小白: 你这么一说,我就有印象了,那,当别人问我他们三者的区别的时候我是不是可以这样回答。

庆哥: 对,可以这么说,但是这样是比较概括性的说,相当于一个总结,对于一些知识我们不仅要知其然还要知其所以然,所以如果别人问你这三者的区别,你可以这么说:

他们三者的区别,总的来说就是String是不可变的,是一个字符串常量,而StringBuffer和StringBuilder都是一个变量,对于StringBuffer则是线程安全的,而StringBuilder则是非线程安全的,其他的两者几乎一样,说的详点就是。。。

小白: 就是什么啊?

庆哥: 别着急嘛,简单的回答这个问题,上述的表达就可以了,不过我们介意更加详细的去说,这等咱们今天晚上共同讨论完成之后就知道啦!

String

小白: 对于String,我应该了解的比较多一些,我觉得大部分人应该也是如此,因为String用的确实比较多,所以知道的也就相对而言多一点,而对于另外两个在平常的编码中用到的不是很多,所以也就不是很了解!

庆哥: 是的,对于String,想必大家都比较熟悉,因为平常用到的比较多,包括之前咱们也讨论了不少关于String’的话题,所以这次我们把重点放在StringBuffer和StringBuilder上,那么我问你一个问题,对于String能够进行频繁的拼接吗?

小白: 这个不能,因为字符串频繁的拼接会产生很多无用的字符串垃圾,比如以下代码

String s1 = "a"+"b";

别看就这么一行代码,由于字符串的拼接在字符串常量池中就会产生“a“和”b“两个字符串垃圾,而有用的不过是生成的字符串”ab“罢了,这一行代码就在内存中开辟了三个空间,所以字符串的拼接是很影响性能的。

庆哥: 可以啊,说的非常好,有的时候如果我们操作的数据比较少的话,这样虽然会影响性能,但是由于数据量非常的小,对于性能的影响则可以忽略不计,但是如果要操作的数据量是非常的大,那该怎么办呢?

小白: 就是啊,如果数据量比较大的话,产生的性能影响就不可以忽略不计了,那这种情况该怎么办呢?

StringBuffer和StringBuilder

庆哥: 这个时候,就需要我们的StringBuffer和StringBuilder了,他们两个就可以解决这样的问题,你说由于String是不可变的,那么会带来什么影响呢?

小白: 由于String的不可变,其实每次操作改变的都不是其自身了,都是重新创建了一个新的字符串,原有的字符串就被丢弃了,比如以下代码

String s1 = "a"+"b";       s1 = "abc";

其实这个时候内存中含有“a”,“b”,“ab”和“abc“四个对象,现在的s1指向的是”abc“,而其他的则成为了无用对象。

庆哥: 是的,所以对于StringBuffer和StringBuilder而言,他们的操作则是基于本身,所以说他们都是变量,不会再次创建一个新的对象,我之前也说了。他们两个最大的区别就是一个是线程安全一个是非线程安全,其他的包括方法都是一样的。

所以我们先来从StringBuffer说起

StringBuffer

就拿你之前举得例子而言

String s1 = "a"+"b";

这样会产生一些无用的对象,那么我们使用StringBuffer该如何操作呢?

StringBuffer buffer = new StringBuffer();        buffer.append("a").append("b");

这样我们就完成了上述相同的功能,得到了字符串“ab“,而这样的方式则不会产生无用的对象,因为其操作的是本身,创建字符串的时候会有一个StringBuffer缓冲区,对于append方法则是在缓冲区的末端进行添加,这样就形成了”ab“字符串,而且不会像String那样创建新的对象。

小白: 我大概知道了,这也跟字符串拼接一样,不过因为有缓冲区,所以不会创建新对象,但是这样只能在末尾添加吗?这样就不灵活了吧

庆哥: 当然不是,其实还可以这样操作

StringBuffer buffer = new StringBuffer();        buffer.append("a").append("b").insert(1,"c");

以上代码产生的结果就是acb,也就是说他还有一个insert方法则是在指定的点添加字符了,这里有两个参数,第一个则表示在哪个位置之后添加新的元素,这个我想不用多解释,大家就明白了。

小白: 哦哦,那这个StringBuffer还怪好用,可以,很强势!那StringBuilder是不是和StringBuffer有同样的方法。

StringBuilder

庆哥: 是的,对于与StringBuilder是非线程安全的,除了这点和StringBuffer是一样的,方法用法也一样。

小白: 哦哦,明白了,没想到还挺简单的。

需要特别注意的效率问题

庆哥: 那我为一个题,你看下面的哪种方式执行的效率比较快!

String s1 = "a" + "b";

StringBuffer buffer = new StringBuffer();        buffer.append("a").append("b");

小白: 我觉得是第二种吧,也就是使用StringBuffer比较快。

庆哥: 实际情况是第一种使用String比较快,因为对于JVM而言其实第一种就相当于

String s1 = "ab";

所以速度很快,但是如果是引用的字符串,比如这样

String s1 = "a";        String s2 = "b";        String s3 = s1 + s2;

那肯定是StringBuffer的方式比较快了。

小白: 为什么会这样呢?

庆哥: 因为其实对于字符串的拼接,其实String的“+”操作就是利用了StringBuffer的append方法,如果不是引用,相当于直接进行了转换,但是如果使用了引用,就要规规矩矩的先创建StringBuffer对象再进行拼接,这比着直接使用StringBuffer肯定就慢了啊。

小白: 原来是这么回事啊,这下明白了。

庆哥: 所以根据这三者的区别,我们可以大致总结一下他们的用法。

  1. 当操作数据量较小可采用String
  2. 数据量比较大且需要修改字符串的话最好使用StringBuffer或者StringBuilder
  3. 在单线程中使用StringBuilder
  4. 在多线程中使用StringBuffer
  5. 总的来说StringBuffer线程安全但是效率低,而StringBilder非线程安全但是效率高。

还有就是,尽量不要使用字符串的拼接!

小白: 哦哦,知道了,多谢庆哥分享!

转载地址:https://ithuangqing.blog.csdn.net/article/details/82262548 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:==和equals的区别?你知道吗?
下一篇:这道关于String的面试题据说80%的人会答错!

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月23日 15时41分58秒