Java String StringBuilder StringBuffer

发表于:2015-4-30 09:40

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:stormzhang    来源:51Testing软件测试网采编

  在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 要快。两者的方法基本相同。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号