String字符串拼接对性能的影响_第1页
String字符串拼接对性能的影响_第2页
String字符串拼接对性能的影响_第3页
String字符串拼接对性能的影响_第4页
String字符串拼接对性能的影响_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 String、StringBuffer & StringBuilder字符串拼接对性能的影响Author:苏康福 date:2013-3-111. StringString字符串是常量;它们的值在创建之后不能更改。String 类包括的方法可用于检查序列的单个字符、比较字符串、搜索字符串、提取子字符串、创建字符串副本并将所有字符全部转换为大写或小写。Java 语言提供对字符串串联符号(+)以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。字符串转换是通过 toString 方法实现的,该方法由

2、Object 类定义,并可被 Java 中的所有类继承。JDK6String 类中每一个看起来会修改字符串值的方法,实际上都是创建一个全新的String对象,以包含修改后的字符串内容。Java ThinkingString对象是不可变的,具有只读特性,指向它的任何引用都不可能改变它的值。String a = “Kangfu”;String b = a ;b += “Su”;String c = a.toUpperCase();a、b、c各指向不同的对象。String的重载操作符“+”和“+=”,可以用来链接字符串。见实验方法一。2. StringBufferStringBuffer,线程安全的

3、可变字符序列。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。JDK63. StringBuilderStringBuilder,一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer

4、的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。StringBuilder 允许预先指定大小。如果知道最终字符串大概长度,那预先指定StingBuilder的大小可以避免多次重新分配缓冲。JDK64. 实例分析定义Java类(见string/test/StringConcatenation.java)1) 方法一源码:Jvm字节码:从字节码可看出,类似这种情况的定义,java编译器直接把拼接表达式看成单个String变量。2) 方法二源码:Jvm字节码:从字节码中可看出,类似这种情况的

5、定义(String变量的定义中带有其他对象参数表达式),java编译器自动创建了一个StringBuilder变量来构造结果。3) 方法三源码:Jvm字节码:从字节码中可看出,循环体从第9行开始到38行结束,每次运行result += SELECT; 都会new StringBuilder()一次,过程中产生大量需要垃圾回收的中间对象。4) 方法四源码:Jvm字节码:从字节码中可看出,循环体从第14行开始到30行结束,循环体内直接调用append方法即可,代码干净整洁,效率也高。四个方法运行结果,见下图。根据运行环境不同,时间也可能不同。但是大概能看出第三个方法运行结果比较糟糕。(两个循环次数

6、为1000结果图)(两个循环次数为10000结果图)5. 结论案例说明实施说明运行时间无参数使用string “+”拼接java编译器直接把拼接表达式看成单个String变量。0带参数使用 string “+” 拼接String变量的定义中带有其他对象参数表达式,java编译器自动创建了一个StringBuilder变量来构造结果,再调用其toString方法。1ms循环中使用 string “+” 拼接每循环一次拼接,都会new StringBuilder()一次,过程中产生大量需要垃圾回收的中间对象,性能很糟糕。循环1000次运行56ms;循环次数10000次运行时间2638ms循环中使用

7、 StringBuilder的append方法拼接循环体内直接调用append方法,代码干净整洁,效率也高。 25 + ORDER BY AGE ASC;return result;/带参数使用String+拼接字符串public String getString(String name, int age)String result = SELECT ID,NAME,CARDID, TRUNC(BORNEDDATE)+ FROM USERINFO + WHERE NAME LIKE % + name + % + AND AGE + age+ ORDER BY AGE ASC;return re

8、sult;/在循环中使用String+拼接字符串public String implicit()String result = ;for(int i=0; i10000; i+)result += SELECT;return result;/在循环中使用StringBuilder拼接字符串public String explicit()StringBuilder result = new StringBuilder();for(int i=0; i10000; i+)result.append(SELECT);return result.toString();/各方法运行时间public st

9、atic void main(String args)StringConcatenation sc = new StringConcatenation();long time1 = 0L, time2 = 0L; Map map = new HashMap();System.out.println(无参数使用String+拼接字符串.);time1 = System.currentTimeMillis();map.put(string1, sc.getString();time2 = System.currentTimeMillis();System.out.println(运行时间: + (

10、time2 - time1) + msnn);System.out.println(带参数使用String+拼接字符串.);time1 = System.currentTimeMillis();map.put(string2, sc.getString(苏, 25);time2 = System.currentTimeMillis();System.out.println(运行时间: + (time2 - time1) + msnn);System.out.println(在循环中使用String+拼接字符串.); time1 = System.currentTimeMillis();map.put(string3, sc.implicit();time2 = System.currentTimeMillis();System.out.println(运行时间: + (time2 - time1) + msnn);System.out.println(在循环中使用String

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论