- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实用标准文案
精彩文档
String、StringBuffer StringBuilder字符串拼接对性能的影响
Author:苏康福 date:2013-3-11
String
String字符串是常量;它们的值在创建之后不能更改。
String 类包括的方法可用于检查序列的单个字符、比较字符串、搜索字符串、提取子字符串、创建字符串副本并将所有字符全部转换为大写或小写。
Java 语言提供对字符串串联符号(+)以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中的所有类继承。《JDK6》
String 类中每一个看起来会修改字符串值的方法,实际上都是创建一个全新的String对象,以包含修改后的字符串内容。《Java Thinking》
String对象是不可变的,具有只读特性,指向它的任何引用都不可能改变它的值。
String a = “Kangfu”;
String b = a ;
b += “Su”;
String c = a.toUpperCase();
a、b、c各指向不同的对象。
String的重载操作符“+”和“+=”,可以用来链接字符串。见实验方法一。
StringBuffer
StringBuffer,线程安全的可变字符序列。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 HYPERLINK mk:@MSITStore:F:\\sukangfu\\jdk6.ZH_cn.chm::/j2se6/api/java/lang/StringBuilder.html \o java.lang 中的类 StringBuilder。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。《JDK6》
StringBuilder
StringBuilder,一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。
StringBuilder 允许预先指定大小。如果知道最终字符串大概长度,那预先指定StingBuilder的大小可以避免多次重新分配缓冲。《JDK6》
实例分析
定义Java类(见string/test/StringConcatenation.java)
方法一
源码:
Jvm字节码:
从字节码可看出,类似这种情况的定义,java编译器直接把拼接表达式看成单个String变量。
方法二
源码:
Jvm字节码:
从字节码中可看出,类似这种情况的定义(String变量的定义中带有其他对象参数表达式),java编译器自动创建了一个StringBuilder变量来构造结果。
方法三
源码:
Jvm字节码:
从字节码中可看出,循环体从第9行开始到38行结束,每次运行result += SELECT; 都会new StringBuilder()一次,过程中产生大量需要垃圾回收的中间对象。
方法四
源码:
Jvm字节码:
从字节码中可看出,循环体从第14行开始到30行结束,循环体内直接调用append方法即可,代码干净整洁,效率也高。
四个方法运行结果,见下图。根据运行环境不同,时间也可能不同。但是大概能看出第三个方法运行结果比较糟糕。
(两个循环次数为1000结果图)
(两个循环次数为10000结果图)
结论
案例说明
实施说明
运行时间
无参数使用string “+”拼接
java编译器直接把拼接表达式看成单个String变量。
0
带参数使用 string “+” 拼接
String变量的定义中带有其他对象参数表达式,java编译器自动创建了一个StringBuilder变量来构造结果,再调用其toString方法。
1ms
循环中使用 string “+” 拼接
每循环一次拼接,都会new StringBuilder()一次,过程中产生大量需要垃圾回收的中间对象,性能很糟糕。
循环1000次运行56ms;
循环次数10000次运行时间2638ms
循环中使用 StringBuilder的append方法拼接
循环体内直接调用ap
您可能关注的文档
最近下载
- 小学研究课题立项申报:基于小学生高阶思维发展的课堂微项目活动设计研究.docx
- 网站安全等级保护--应急预案.docx
- 输送带发展前景分析.pptx
- IPC-6018c,6018cs,6017,6016,6015,6013d,6012e,ds,da 英文资料分享.pdf
- 高中数学公式(经典).doc VIP
- 顶管施工测量方案.doc
- 2024年度医院中医肛肠外科科带教计划课件.pptx
- 全国青少年劳动技能与智能设计大赛赛题与评价标准.PDF
- 2021-2022学年福建省宁德市校际联盟八年级(上)第一次月考英语试卷(附答案详解).docx VIP
- 2023年(最全版)二级建造师考试真题及参考答案.docx
文档评论(0)