实现String字符串相加的方法有很多,常见的有直接相加,StringBuilder.append和String.format,这三者的运行效率是有差异的,String是final类型的,每次相加都会new一个

新的String对象,如果这种操作很多的话,很占用很大的内存。而StringBuilder.append方法是在原对象上进行操作,如果长度不够就自行扩展。

测试代码1:

<span style="white-space:pre">	</span>String success_code = "0";

	byte splite = 0x01;

	private void method1(){
String resultMsg = "";
long time1 = System.nanoTime();
String.format("ErrorCode=%s%cErrorMsg=心跳包接收成功%c", success_code, splite, splite);
long time2 = System.nanoTime();
System.out.println("StringFormat:"+(time2-time1)+"ns"); long time3 = System.nanoTime();
resultMsg = "ErrorCode="+success_code+splite+"ErrorMsg=心跳包接收成功"+splite;
long time4 = System.nanoTime();
System.out.println("String add:"+(time4-time3)+"ns"); long time5 = System.nanoTime();
sb.append("ErrorCode=").append(success_code).append(splite).append("ErrorMsg=心跳包接收成功").append(splite);
long time6 = System.nanoTime();
System.out.println("StringBuilder add:"+(time6-time5)+"ns");
System.out.println("-------------------------------------------------");
} @Test
public void test1(){
for(int i=0; i<1000; i++){
method1();
}
}

运行结果:

StringFormat:58025ns
String add:3158ns
StringBuilder add:1579ns
-------------------------------------------------
StringFormat:43026ns
String add:3948ns
StringBuilder add:1974ns
-------------------------------------------------
.....
StringFormat:46973ns
String add:1579ns
StringBuilder add:790ns
-------------------------------------------------
StringFormat:52499ns
String add:1578ns
StringBuilder add:790ns
-------------------------------------------------
StringFormat:43026ns
String add:1579ns
StringBuilder add:790ns
-------------------------------------------------

从上述结果可知,StringBuilder与String直接相加的执行效率都比String.format高, 而StringBuilder的执行效率要比String直接相加要高点。下面针对String,StringBuilder再

做一组测试。

测试代码2:

<span style="white-space:pre">	</span>public void method2(int num){
String text = "";
long beginTime = System.nanoTime();
for(int i = 0; i < num; i++){
text += i;
}
long endTime = System.nanoTime();
System.out.println("String直接相加"+num+"次耗费时间:" + (endTime - beginTime)+"ns");
StringBuilder builder = new StringBuilder("");
beginTime = System.nanoTime();
for(int i = 0; i < num; i++){
builder.append(i);
}
endTime = System.nanoTime();
System.out.println("StringBuilder相加"+num+"次耗费时间:" + (endTime - beginTime)+"ns");
System.out.println("---------------------------------------------------");
} @Test
public void test2(){
method2(10);
method2(100);
method2(10000);
method2(100000);
}

运行结果:

String直接相加10次耗费时间:19737ns
StringBuilder相加10次耗费时间:3553ns
---------------------------------------------------
String直接相加100次耗费时间:56447ns
StringBuilder相加100次耗费时间:47762ns
---------------------------------------------------
String直接相加10000次耗费时间:266082677ns
StringBuilder相加10000次耗费时间:999061ns
---------------------------------------------------
String直接相加100000次耗费时间:45212528095ns
StringBuilder相加100000次耗费时间:3040604ns
---------------------------------------------------

从测试结果可分析出,StringBuilder的效率是比String高。

再来看一个测试,代码和上面的一样,只是SringBuilder加上个toString

测试代码:

String success_code = "0";

	byte splite = 0x01;

	private void method1(){
String resultMsg = "";
long time1 = System.nanoTime();
resultMsg = String.format("ErrorCode=%s%cErrorMsg=心跳包接收成功%c", success_code, splite, splite);
long time2 = System.nanoTime();
System.out.println("StringFormat:"+(time2-time1)+"ns"); long time3 = System.nanoTime();
resultMsg = "ErrorCode="+success_code+splite+"ErrorMsg=心跳包接收成功"+splite;
long time4 = System.nanoTime();
System.out.println("String add:"+(time4-time3)+"ns"); long time5 = System.nanoTime();
resultMsg = sb.append("ErrorCode=").append(success_code).append(splite).append("ErrorMsg=心跳包接收成功").append(splite).toString();
long time6 = System.nanoTime();
System.out.println("StringBuilder add:"+(time6-time5)+"ns");
System.out.println("-------------------------------------------------");
}
<span style="white-space:pre">	</span>@Test
public void test1(){
for(int i=0; i<10; i++){
method1();
}
}

运行结果:

StringFormat:564859ns
String add:55657ns
StringBuilder add:3158ns
-------------------------------------------------
StringFormat:98683ns
String add:2368ns
StringBuilder add:1974ns
-------------------------------------------------
StringFormat:69867ns
String add:2369ns
StringBuilder add:1974ns
-------------------------------------------------
StringFormat:77762ns
String add:3552ns
StringBuilder add:2369ns
-------------------------------------------------
StringFormat:105788ns
String add:3948ns
StringBuilder add:2368ns
-------------------------------------------------
StringFormat:78552ns
String add:2763ns
StringBuilder add:1974ns
-------------------------------------------------
StringFormat:68683ns
String add:2368ns
StringBuilder add:1974ns
-------------------------------------------------
StringFormat:67894ns
String add:2369ns
StringBuilder add:1973ns
-------------------------------------------------
StringFormat:67499ns
String add:2369ns
StringBuilder add:1974ns
-------------------------------------------------
StringFormat:116840ns
String add:3948ns
StringBuilder add:3552ns
-------------------------------------------------

当运行10次时,均显示StringBuilder.append.toString的效率比String的直接相加高。

测试执行10000次,结果如下:

StringFormat:9079ns
String add:789ns
StringBuilder add:153550ns
-------------------------------------------------
StringFormat:18552ns
String add:789ns
StringBuilder add:141708ns
-------------------------------------------------
StringFormat:9078ns
String add:395ns
StringBuilder add:122761ns
-------------------------------------------------
。。。。

发现当执行10000次时,出现StringBuilder的执行效率比String低了很多,原因暂未发现。

String+,StringBuilder,String.format运行效率比较的更多相关文章

  1. String+ String.Concat String.Format StringBuilder 之间的性能测试

    找到一篇国外的代码,专门来测试这个, String+ String.Concat String.Format StringBuilder 前三个在100个左右字符串差不多, String.Concat ...

  2. difference among String,StringBuilder,StringBuffer

    difference among String,StringBuilder,StringBuffer String常用构造函数 String(byte[] bytes) String(byte[] b ...

  3. String StringBuilder以及StringBuffer

    例一:[看了威哥视频,下面更好理解] package sunjava; public class String_test { public static void main(String[] args ...

  4. Java中String类的format方法使用总结

    可参考: http://www.cnblogs.com/fsjohnhuang/p/4094777.html http://kgd1120.iteye.com/blog/1293633 String类 ...

  5. String, StringBuilder 与StringBuffer的区别与联系

    1.区别 (1)String构建的对象不能改变,每次对String进行操作时,如两个String相加,需要新建一个String对象,然后容纳最终的结果. 而StringBuilder与StringBu ...

  6. 深入源码剖析String,StringBuilder,StringBuffer

    [String,StringBuffer,StringBulider] 深入源码剖析String,StringBuilder,StringBuffer [作者:高瑞林] [博客地址]http://ww ...

  7. String, StringBuilder, StringBuffer问题

    1. 区别 String为字符串常量,而StringBuilder和StringBuffer都是字符串变量,其中StringBuilder线程非安全,StringBuffer线程安全. 每次对 Str ...

  8. String,StringBuilder,StringBuffer的对比测试

    public class TestString { private static final int COUNT = 10000000; public static void main(String ...

  9. String&StringBuilder&StringBuffer总结

    一.String的JVM内存分配测试与分析           String a="a"; String b="b"; String c="ab&qu ...

  10. String StringBuilder 包装类

    1. String 概述 程序中直接写上双引号的字符串就在字符串常量池中,new的不在池当中 java6之前常量池在方法区,java7以后将字符串常量池放在堆中 因为字符串是对象,应该在堆中 相同的字 ...

随机推荐

  1. [記錄用]python py2app 檔案批次重新命名

    demo.py 主要作用為 將同目錄下 *.mp4 檔案批次重新命名 例如: aaa001.mp4 ---重新命名為--> 001.mp4 aaa002.mp4 ---重新命名為--> 0 ...

  2. STM32之SD卡

    目录 一.SD卡概述 1.定义 2.容量等级 3.SD卡框图 4.SD卡与TF卡的区别 二. SD卡内部结构 1. SD卡内部结构简图 2. 存储阵列结构图 3.Buffer 4.“存储阵列Block ...

  3. 不建议使用NSUserDefault存储大量数据

    NSUserDefaults 其实是一个 plist 文件(有待验证),即使只是修改一个 key 都会 load 整个文件,不适合存储大量数据. NSUserDefaults是保存成文本格式的,容易被 ...

  4. django HTTP请求(Request)和回应(Response)对象

    Django使用request和response对象在系统间传递状态.—(阿伦)当一个页面被请示时,Django创建一个包含请求元数据的 HttpRequest 对象. 然后Django调入合适的视图 ...

  5. Uva 10294 Arif in Dhaka (First Love Part 2)

    Description 现有一颗含\(N\)个珠子的项链,每个珠子有\(t\)种不同的染色.现求在旋转置换下有多少种本质不同的项链,在旋转和翻转置换下有多少种本质不同的项链.\(N < 51,t ...

  6. 处理 insert 字段内容包含 单引号 的问题

    问题:postgreSQL insert 字段包含单引号,如:insert into table values('1001','tom'cat'),执行报错: 解决:将单引号替换为两个单引号,如 de ...

  7. Http状态码完整说明

    在网站建设的实际应用中,容易出现很多小小的失误,就像mysql当初优化不到位,影响整体网站的浏览效果一样,其实,网站的常规http状态码的表现也是一样, 一些常见的状态码为: 200 - 服务器成功返 ...

  8. 安装scrapy

  9. android学习——ADT的离线安装

    前一篇讲解了ADT的在线安装,不过有的时候在线在线安装的速度很慢.所以今天学习一下ADT的离线安装: 首先 下载与SDK相对应的ADT(如果SDK是最新版的就下最新版ADT否则就把SDK更新到最新版以 ...

  10. HDU-2368 Alfredo's Pizza Restaurant

    http://acm.hdu.edu.cn/status.php Alfredo's Pizza Restaurant Time Limit: 1000/1000 MS (Java/Others)   ...