Java 中String StringBuilder 与 StringBuffer详解及用法实例

 更新时间:2017年02月13日 14:23:57   投稿:lqh  
这篇文章主要介绍了Java 中String StringBuilder 与 StringBuffer详解及用法实例的相关资料,需要的朋友可以参考下

在Android/Java开发中,用来处理字符串常用的类有3种: String、StringBuilder、StringBuffer。

它们的异同点:

1) 都是 final 类, 都不允许被继承;
2) String 长度是不可变的, StringBuffer、StringBuilder 长度是可变的;
3) StringBuffer 是线程安全的, StringBuilder 不是线程安全的。

String VS StringBuffer

String 类型和StringBuffer的主要性能区别:String是不可变的对象, 因此在每次对String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,性能就会降低。

使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。所以多数情况下推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。

在某些特别情况下, String 对象的字符串拼接其实是被 Java Compiler 编译成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,例如:

String s1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);

生成 String s1对象的速度并不比 StringBuffer慢。其实在Java Compiler里,自动做了如下转换:

Java Compiler直接把上述第一条语句编译为:

String s2 = “This is only a”; 
String s3 = “ simple”; 
String s4 = “ test”; 
String s1 = s2 + s3 + s4;

这时候,Java Compiler会规规矩矩的按照原来的方式去做,String的concatenation(即+)操作利用了StringBuilder(或StringBuffer)的append方法实现,此时,对于上述情况,若s2,s3,s4采用String定义,拼接时需要额外创建一个StringBuffer(或StringBuilder),之后将StringBuffer转换为String;若采用StringBuffer(或StringBuilder),则不需额外创建StringBuffer。

StringBuilder

StringBuilder是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

使用策略

1) 基本原则:如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer。

2) 不要使用String类的”+”来进行频繁的拼接,因为那样的性能极差的,应该使用StringBuffer或StringBuilder类,这在Java的优化上是一条比较重要的原则。例如:

String result = ""; 
for (String s : hugeArray) { 
 result = result + s; 
} 

// 使用StringBuilder 
StringBuilder sb = new StringBuilder(); 
for (String s : hugeArray) { 
 sb.append(s); 
} 
String result = sb.toString();

当出现上面的情况时,显然我们要采用第二种方法,因为第一种方法,每次循环都会创建一个String result用于保存结果,除此之外二者基本相同.

3) StringBuilder一般使用在方法内部来完成类似”+”功能,因为是线程不安全的,所以用完以后可以丢弃。StringBuffer主要用在全局变量中。

4) 相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非确定系统的瓶颈是在 StringBuffer 上,并且确定你的模块不会运行在多线程模式下,才可以采用StringBuilder;否则还是用StringBuffer。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • Spring Batch远程分区的本地Jar包模式的代码详解

    Spring Batch远程分区的本地Jar包模式的代码详解

    这篇文章主要介绍了Spring Batch远程分区的本地Jar包模式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Redis缓存及热点key问题解决方案

    Redis缓存及热点key问题解决方案

    这篇文章主要介绍了Redis缓存及热点key问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • java 线程创建多线程详解

    java 线程创建多线程详解

    本文主要讲解java 线程创建多线程的知识,这里对java线程的创建做了详细介绍,并附简单示例代码,有兴趣的小伙伴可以参考下
    2016-09-09
  • MyBatis入门学习教程(一)-MyBatis快速入门

    MyBatis入门学习教程(一)-MyBatis快速入门

    MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架,这篇文章主要给大家分享MyBatis入门学习教程(一)-MyBatis快速入门,需要的朋友可以参考下
    2015-08-08
  • SpringBoot整合MongoDB的步骤详解

    SpringBoot整合MongoDB的步骤详解

    这篇文章主要介绍了SpringBoot整合MongoDB的步骤详解,帮助大家更好的理解和学习使用SpringBoot框架,感兴趣的朋友可以了解下
    2021-04-04
  • SpringBoot2零基础到精通之自动配置底层分析及小技巧

    SpringBoot2零基础到精通之自动配置底层分析及小技巧

    SpringBoot是一种整合Spring技术栈的方式(或者说是框架),同时也是简化Spring的一种快速开发的脚手架,本篇让我们一起学习自动配置的底层分析与一些开发中的小技巧
    2022-03-03
  • JAVA多线程进阶方式(Runnable接口的讲解和运用)

    JAVA多线程进阶方式(Runnable接口的讲解和运用)

    这篇文章主要介绍了JAVA多线程进阶方式(Runnable接口的讲解和运用),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • java web实现简易收费站

    java web实现简易收费站

    这篇文章主要为大家详细介绍了java web实现简易收费站,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一
    2020-11-11
  • Java中Collections.sort()排序方法举例详解

    Java中Collections.sort()排序方法举例详解

    很多时候都需要对一些数据进行排序的操作,这篇文章主要给大家介绍了关于Java中Collections.sort()方法举例详解的相关资料,使用Collections.sort()可以使用其sort()方法来对List、Set等集合进行排序,需要的朋友可以参考下
    2024-02-02
  • idea如何debug看springsecurity的过滤器顺序

    idea如何debug看springsecurity的过滤器顺序

    这篇文章主要介绍了idea如何debug看springsecurity的过滤器顺序,文中通过图文结合的方式给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-04-04

最新评论