- 浏览: 199945 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
weituotian:
这个楼主热心肠,看得简单明了
HttpServletRequest地址获取 -
u011701322:
...
Jquery UI sortable 所有事件 -
CoderDream:
Mark!
jquery ajax post 传递数组 ,多checkbox 取值 -
maomao14:
楼主写的不错,感谢分享,最近我在 http://gotoma ...
jquery ajax post 传递数组 ,多checkbox 取值
前几天性能测试的时候发现一个web 端cpu出现骤降的问题,一直没有找到原因,起初怀疑是tomcat的线程数有关,后来有怀疑是跟数据库的响应时间太长有关系,后来都一一排除了。
之所以此问题比较难以定位主要是因为通过现有的监控工具无法获知和分析tomcat内部各个线程的占用资源的情况。
上周装了一下jprofiler,然后又重新进行了一次压力测试,终于找到了问题的根源:)
主要的资源消耗点是:字符串的拼接上。代码中时使用”+“来进行字符串连接的。
(ps:jprofiler监控的粒度很细,但是由于其本身运行占用的资源消耗量也很大,因此在进行性能测时不能用其作为监控工具,在分析问题方面还是蛮有用的;jconsole是java自带的监控工具,其在远程监控应用程序时,不会对程序的性能造成影响,但由于其监控的粒度还是有些粗,因此tomcat内部的资源占用情况还是无法进行分析的)
JAVA中String ,StringBuffer,SrtingBuilder三个对象连接字符串的效率。
比较下究竟谁的效率高。因为我们经常都听有经验的人说,避免使用String通过“+”连接字符串,特
别是连接的次数很多的时候,一定要用StringBuffer,但究竟效率多高,速度多快,我也没有测试过,
所以我就动手测试下,顺便把测试结果跟大家一起分享,希望大家共同讨论此问题。
下边是我的测试代码,可直接运行:
public class TestStringConnection { //连接时间的设定 private final static int n = 20000; public static void main(String[] args){ TestStringConnection test = new TestStringConnection (); test.testStringTime(n); test.testStringBufferTime(n); test.testStringBuilderTime(n); // //连接10次 // test.testStringTime(10); // test.testStringBufferTime(10); // test.testStringBuilderTime(10); // // //连接100 // // test.testStringTime(100); // test.testStringBufferTime(100); // test.testStringBuilderTime(100); // // // // //连接1000 // // test.testStringTime(1000); // test.testStringBufferTime(1000); // test.testStringBuilderTime(1000); // // // //连接5000 // // test.testStringTime(5000); // test.testStringBufferTime(5000); // test.testStringBuilderTime(5000); // // // //连接10000 // // test.testStringTime(10000); // test.testStringBufferTime(10000); // test.testStringBuilderTime(10000); // // //连接20000 // // test.testStringTime(20000); // test.testStringBufferTime(20000); // test.testStringBuilderTime(20000); } /** *测试String连接字符串的时间 */ public void testStringTime(int n){ long start = System.currentTimeMillis(); String a = ""; for(int k=0;k<n;k++ ){ a += "_" + k; } long end = System.currentTimeMillis(); long time = end - start; System.out.println("//////////////////////连接"+n+"次" ); System.out.println("String time "+n +":"+ time); //System.out.println("String str:" + str); } /** *测试StringBuffer连接字符串的时间 */ public void testStringBufferTime(int n){ long start = System.currentTimeMillis(); StringBuffer b = new StringBuffer() ; for(int k=0;k<n;k++ ){ b.append( "_" + k ); } long end = System.currentTimeMillis(); long time = end - start; System.out.println("StringBuffer time "+n +":"+ time); //System.out.println("StringBuffer str:" + str); } /** *测试StringBuilder连接字符串的时间 */ public void testStringBuilderTime(int n){ long start = System.currentTimeMillis(); StringBuilder c = new StringBuilder() ; for(int k=0;k<n;k++ ){ c.append( "_" + k ); } long end = System.currentTimeMillis(); long time = end - start; System.out.println("StringBuilder time " +n +":"+ time); System.out.println("//////////////////////"); //System.out.println("StringBuffer str:" + str); } }
分别测试了n=10,100,500,1000,5000,10000,20000的时候,三个对象连接字符串所花费的时间,
做了个简单统计,得到如下数据:
做了个简单统计,得到如下数据:
测试环境:eclipse
|
由上边的图表结果对比,可以清楚的看出,为什么大家都鼓励用StringBuffer连接字符串了。在连接次数少
的情况下,String的低效率表现并不是很突出,但是一旦连接次数多的时候,性能影响是很大的,String进
行2万次字符串的连接,大约需要1分钟时间,而StringBuffer只需要94毫秒,相差接近500倍以上。而
StringBuffer和StringBuilder差别并不大,StringBuilder比StringBuffer稍微快点,我想是因为StringBuffer
是线程序安全的,StringBuilder不是线程序安全的,所以StringBuffer稍微慢点。
的情况下,String的低效率表现并不是很突出,但是一旦连接次数多的时候,性能影响是很大的,String进
行2万次字符串的连接,大约需要1分钟时间,而StringBuffer只需要94毫秒,相差接近500倍以上。而
StringBuffer和StringBuilder差别并不大,StringBuilder比StringBuffer稍微快点,我想是因为StringBuffer
是线程序安全的,StringBuilder不是线程序安全的,所以StringBuffer稍微慢点。
但是为什么String如此慢呢,分下如下简单片段
String result="";
result+="ok";
这段代码看上去好像没有什么问题,但是需要指出的是其性能很低,原因是java中的String
类不可变的(immutable),这段代码实际的工作过程会是如何的呢?通过使用javap工具我
们可以知道其实上面的代码在编译成字节码的时候等同的源代码是: String result="";
StringBuffer temp=new StringBuffer();
temp.append(result);
temp.append("ok");
result=temp.toString();
短短的两个语句怎么呢变成这么多呢?问题的原因就在String类的不可变性上,而java程序为了方便简单的
字符串使用方式对+操作符进行了重载,而这个重载的处理可能因此误导很多对java中String的使用。
短短的两个语句怎么呢变成这么多呢?问题的原因就在String类的不可变性上,而java程序为了方便简单的
字符串使用方式对+操作符进行了重载,而这个重载的处理可能因此误导很多对java中String的使用。
所以,如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后
需要String,那么使用StringBuffer的toString()方法好了。但是 StringBuilder 的实例用于多个线程是不安
全的。如果需要这样的同步,则建议使用 StringBuffer,因为StringBuffer是线程安全的。在大多数非多
线程的开发中,为了提高效率,可以采用StringBuilder代替StringBuffer,速度更快。
需要String,那么使用StringBuffer的toString()方法好了。但是 StringBuilder 的实例用于多个线程是不安
全的。如果需要这样的同步,则建议使用 StringBuffer,因为StringBuffer是线程安全的。在大多数非多
线程的开发中,为了提高效率,可以采用StringBuilder代替StringBuffer,速度更快。
原文地址:http://hi.baidu.com/xinghoney/blog/item/c61ede4c995247ffd62afc2f.html
发表评论
-
java web 文件下载
2013-10-15 09:33 770File file = new File(fileName) ... -
JSP使用JDBC显示BLOB图片文件
2012-05-24 12:07 3056<%@page import="java ... -
java Servlet 下载 itext 生成的2003 word 文档(java生成word文档3)
2012-05-08 15:22 1958package cn.net.seek.servlet. ... -
java 通过使用itext 生成2003 word 文档(java生成word文档2)
2012-05-08 15:20 1306public static RtfWriter2 get ... -
java 通过使用poi hpsf 生成2003 word 文档(java生成word文档1)
2012-05-08 15:18 7524import java.io.*; import ... -
EL表达式取值
2011-12-13 00:26 865${param.id} ==》request.getPa ... -
getOutputStream() has already been called for this response异常的原因和解决方法
2011-12-07 10:05 8411.tomcat5下jsp出现getOutputStre ... -
response文件下载四步骤【转】
2011-12-06 15:44 1227//1. 设置下载类型 response. ... -
java压缩图片【转】
2011-11-08 17:06 1079在我们浏览网页的时候,我们呢时常见到这样的效果,点击小图 ... -
过滤字符串中的HMTL实体
2011-09-28 10:36 854sourceStr.replaceAll("& ... -
Java深度理解——Java字节代码的操纵
2011-09-23 10:20 832导读:Java作为业界应用最为广泛的语言之一,深得众多软件 ... -
浅谈java中的四个核心概念【转】
2011-09-23 10:18 823Java已经成为一个庞大而复杂的技术平台,对于开发人员而言 ... -
java中的移位运算
2011-09-23 10:14 1091一 基本概念 所有的整数类型以二进制数字位的变 ... -
json所需包
2011-09-14 18:33 832commons-logging-1.0.4.jar ... -
ASCII,Unicode,UTF-8,GB2312一些关于编码的理解【转】
2011-08-16 11:37 875字符编码:ASCII,Unicode,UTF-8,GB23 ... -
Servlet四种过滤器的工作方式
2011-07-07 15:43 882从J2EE1.3开始,Servlet2.3 ... -
Java序列化的作用
2011-07-07 15:36 788序列化是什么: ... -
Jsp抓取页面内容
2011-06-24 16:41 1918<%@ page contentType=&quo ... -
Struts2 保存用户IP到cookie
2011-06-22 15:18 1516// 保存用户IP到cookie public vo ... -
Java计算百分比
2011-06-08 10:54 1296/** * 获取百分比 ...
相关推荐
String、StringBuilder和StringBuffer的区别 String、StringBuilder和StringBuffer的区别 String、StringBuilder和StringBuffer的区别
C# StringBuilder 拼接字符串 字符串转换工具 StringBuilder比StringBuffer运行速度要快,因为StringBuilder是针对于单线程的,所这它是非线程安全的。普通情况下建议使用StringBuilder。
String,StringBuffer,StringBuilder区别。几乎所有的应用开发都离不开操作字符串,理解字符串的设计和实现以及相关 工具如拼接类的使用,对写出高质量代码是非常有帮助的
String ,StringBuffer与StringBuilder的区别
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。 在使用 StringBuffer 类...
String:字符串常量 StringBuffer:字符创变量 StringBuilder:字符创变量 从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段...
String StringBuffer和StringBuilder 区别之源码解析 从源码角度简单对它们之间的区别进行了验证
介绍了String、StringBuffer、StringBuilder的使用方法,以及理论知识
Java的StringBuffer和StringBuilder类是用于字符串操作的可变字符序列类。...通过学习本文,您将掌握如何灵活使用StringBuffer和StringBuilder类来处理字符串,并了解它们在不同场景下的应用和性能特点
Java中的StringBuffer和StringBuilder类是用于处理字符串的可变对象; 它们与String类类似,但是不同之处在于,StringBuffer和StringBuilder可以修改字符串内容,而String对象是不可变的; StringBuffer和...
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上...
我们都知道,在Java中字符串可以用+连接,也可以使用StringBuilder或StringBuffer连接。 String str = abc+xyz; 那么这几种方式由什么区别呢。当然你可能会知道以下几点 String是只读字符串,String引用的字符串...
JavaScript 利用StringBuffer类提升+=拼接字符串效率,需要的朋友可以参考下。
String及StringBuffer和StringBuilder的区别
简单的介绍了String、StringBuffer和StringBuilder的区别
stringbuilder用法 String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String...
1.2 使用数组 在常用的语言中,字符串连接运算的性能普遍不高,为此在C#中就专门提供了StringBuilder(Java中提供了StringBuffer)用于连接字符串。而在Javascript中就出现了通过Array模拟StringBuilder的方案。 ...
String和StringBuilder、...StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。
主要针对Java中两个常用的操作字符串的类 StringBuilder和StringBuffer进行源码分析,感兴趣的小伙伴们可以参考一下
string,stringbuffer,stringbuilder