网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  使用string还是stringbuffer?     
  文章作者:未知  文章来源:水木森林  
  查看:93次  录入:管理员--2007-11-17  
 
  出于方便的考虑,我们在进行字符串的内容处理的时候往往会出现以下的代码:
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的使用。
下面给出一个完整的代码:

public class perf {
public static string detab1(string s)
{
if (s.indexof(´ ´) == -1)
return s;
string res = "";
int len = s.length();
int pos = 0;
int i = 0;
for (; i < len && s.charat(i) == ´ ´; i++)
{
res += " ";
pos += 8;
}
for (; i < len; i++)
{
char c = s.charat(i);
if (c == ´ ´) {
do {
res += " ";
pos++;
} while (pos % 8 != 0);
}
else {
res += c;
pos++;
}
}
return res;
}

public static string detab2(string s)
{
if (s.indexof(´ ´) == -1)
return s;
stringbuffer sb = new stringbuffer();
int len = s.length();
int pos = 0;
int i = 0;
for (; i < len && s.charat(i) == ´ ´; i++)
{
sb.append(" ");
pos += 8;
}
for (; i < len; i++) {
char c = s.charat(i);
if (c == ´ ´) {
do {
sb.append(´ ´);
pos++;
} while (pos % 8 != 0);
}
else {
sb.append(c);
pos++;
}
}
return sb.tostring();
}

public static string testlist[] = {
"",
" ",
" abc",
"abc def",
"1234567 8",
"12345678 9",
"123456789 "
};

public static void main(string args[])
{
for (int i = 0; i < testlist.length; i++) {
string tc = testlist[i];
if (!detab1(tc).equals(detab2(tc)))
system.err.println(tc);
}

string test_string =
" this is a test of detabbing performance";
int n = 5000;
int i = 0;

long ct = system.currenttimemillis();
for (i = 1; i <= n; i++)
detab1(test_string);
long elapsed = system.currenttimemillis() - ct;
system.out.println("string time = " + elapsed);

ct = system.currenttimemillis();
for (i = 1; i <= n; i++)
detab2(test_string);
elapsed = system.currenttimemillis() - ct;
system.out.println("stringbuffer time = "
+ elapsed);
}
}

执行以上代码的结果可以看到使用stringbuffer的版本的方法比使用string版本的一般都快十倍以上(本人使用的是jdk1.4.0),你可以执行一下看看结果到底如何。
因此得到的结论是:如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用stringbuffer,如果最后需要string,那么使用stringbuffer的tostring()方法好了!也许这就是你的程序的性能瓶颈!
 
 
上一篇: 使用stopwatch类来计时    下一篇: 使用xml小服务程序配置文件配置小服务程序
  相关文档
sun certified java programmer 11-17
初探java类加载机制的奥秘 11-16
java socket编程(一) socket传输模式 11-16
java通用集合库 11-17
j2ee配置指南 11-16
java编程规范 11-16
各种数据库连接代码 11-17
java初学者实践教程25-多线程 11-17
使用javamail发送邮件 11-17
深入探讨sql server 2000对xml的支持(一) 11-17
面向对象编程:java复杂数据类型用法 12-10
利用udpsockets技术实现ip多点传送 11-16
rmi规范--第三章 11-17
《thinking in java》学习笔记(二)——万事万物皆对象 11-17
我见过的最长的表达式 11-17
j2me 进度条与线程化模型实例解析 11-17
十步搞定Servlet中的mssql2000数据库连接池 08-06
用jsp定制标签创建丰富的超连接(二) 11-17
jsf与web完美应用组合 高度提升开发效率 06-11
“编程美女”记:立志向编程牛人学java 11-16
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息