下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

为什么 Java 8 中不再需要 StringBuilder 拼接字符串

作者:课课家教育     来源: http://www.kokojia.com点击数:1505发布时间: 2017-09-03 09:00:43

标签: Web开发JavaStringBuilder

Web开发

  在java开发者中,字符串的拼接占用资源高往往是热议的话题.

  让我们深入讨论一下为什么会占用高资源。

  在Java中,字符串对象是不可变的,意思是它一旦创建,你就无法再改变它。所以在我们拼接字符串的时候,创建了一个新的字符串,旧的被垃圾回收器所标记。

为什么 Java 8 中不再需要 StringBuilder 拼接字符串_Web开发_Java_StringBuilder_课课家教育

  如果我们处理上百万的字符串,然后,我们就会生成百万的额外字符串被垃圾回收器处理。

  虚拟机底层在拼接字符串时执行了众多操作。拼接字符串最直接的点操作(dotoperator)就是String#concat(String)操作。

 虚拟机底层在拼接字符串时执行了众多操作。拼接字符串最直接的点操作(dotoperator)就是String#concat(String)操作。

 虚拟机底层在拼接字符串时执行了众多操作。拼接字符串最直接的点操作(dotoperator)就是String#concat(String)操作。

  你可以看到一个字符数组被创建,长度则是已有字符和拼接的字符长度之和。然后,它们的值复制到新的字符数组中。最后,用这个字符数组创建一个String对象并返回。

  所以这些操作繁多,如果你计算一下,会发现是O(n^2)的复杂度。

  为了解决这个问题,我们使用StringBuilder类。它就像可变的String类。拼接方法帮助我们避免不必要的复制。它拥有O(n)的复杂度,远远优于O(n^2)。

  然而Java8默认使用StringBuilder拼接字符串。

  Java8的文档说明:

  为了提高字字符串拼接的性能,Java编译器可以使用StringBuffer类或类似技术,在使用求值表达式时,减少中间String对象的创建。

    Java编译器处理这种情况:

Java8的文档说明:    为了提高字字符串拼接的性能,Java编译器可以使用StringBuffer类或类似技术,在使用求值表达式时,减少中间String对象的创建。      Java编译器处理这种情况:

  上面的代码会被编译成如下字节码:

 上面的代码会被编译成如下字节码:

  你可以在这些字节码中看到,使用了StringBuilder。所以我们在Java8中不再需要使用StringBuilder类。

  看完上文关于为什么Java8中不再需要StringBuilder拼接字符串的内容,那么你知道java字符串拼接技巧(StringBuilder使用技巧)吗?下面来看一下:

  在平时的开发中,我们可能会遇到需要拼接如下格式的字符串(至少我是遇到了很多次):

在平时的开发中,我们可能会遇到需要拼接如下格式的字符串(至少我是遇到了很多次):

  这个字符串的特点:多个数据之间通过某一个特殊符号分割。

  以前小编都是这样想的,相信很多的人也是这样想的:

这个字符串的特点:多个数据之间通过某一个特殊符号分割。    以前小编都是这样想的,相信很多的人也是这样想的:

  看到这里,你平时的做法是不是也是这样的,每一次循环中都存在这样一个判断,如果是回答是肯定的,那么你就有必要继续往下看了,因为以上的方式确实不怎么明智。(至少对于小编这个强迫症&&追求完美的人来说,这样的代码让小编很不爽)。

  在这里不会有人要反驳的代码,要我用"+"来拼接字符串吧,如果你真是这样想的,OhMyGod!!!

  小编在这里提供两种我知道的方式去解决这种现象问题:

  方法一:首先取出集合的第一个元素,通过StringBuilder的构造方法,传入第一个元素,这样是不是后面的每一次循环就不需要判断了啊?

 方法一:首先取出集合的第一个元素,通过StringBuilder的构造方法,传入第一个元素,这样是不是后面的每一次循环就不需要判断了啊?

  很多小伙伴想到了上面的方式是通过技巧(javaapi的掌握熟练程度)将第一个特殊的元素取出来,特殊处理,后面的是不是每一个元素都有规律了,都是以一个字符加上一个数据。想到这里,你有没有想到点其他的?

  作为一个程序员我们就应该练就一身举一反三的本领,上面的方式既然能够将第一个元素作为特殊的数据单独提取出来,那么有没有办法将最后的一个数据也作为特殊数据单独提取出来,前面的其他数据不是就有规律可循了吗?

  方式二:很多人都熟悉StringBuilder的append();方法,但是很多人却不知道StringBuilder的delete(intstartPost,intendPost);如果你有举一反三的学习习惯,那么很容易就会掌握到这个api接口。其实在java的api中很多都是相对的,通过这种方式去学习,很快你就会发现自己知道的就很多。

 方式二:很多人都熟悉StringBuilder的append();方法,但是很多人却不知道StringBuilder的delete(intstartPost,intendPost);如果你有举一反三的学习习惯,那么很容易就会掌握到这个api接口。其实在java的api中很多都是相对的,通过这种方式去学习,很快你就会发现自己知道的就很多。

  小编结语:

  以上只是小编针对这一个小的知识点的技巧告诉大家,在学习中应该多学会举一反三,掌握学习方法是你学好编程的一条捷径。欢迎大家有更好的学习方法,学习技巧,知识点技巧与小编共同讨论与分享。

  更多内容尽在课课家教育!  

赞(24)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程