天下·网吧联盟
登录 申请网盟通行证 忘记密码 逛逛论坛
当前位置:首页 >> 技术纵横 >> 编程基地 >> Java入门-漫谈Java程序的性能优化
Java入门-漫谈Java程序的性能优化
作者:shenkai   2008年03月14日  来源:塞迪网
收藏本文  打印此页  举报本文  评论  投稿

Java使得复杂应用的开发变得相对简单。毫无疑问,它的这种易用性对Java的大范围流行功不可没。然而,这种易用性实际上是一把双刃剑。一个设计良好的Java程序,性能表现往往不如一个同样设计良好的C++程序。在Java程序中,性能问题的大部分原因并不在于Java语言,而是在于程序本身。养成好的代码编写习惯非常重要,比如正确地、巧妙地运用java.lang.String类和java.util.Vector类,它能够显著地提高程序的性能。下面我们就来具体地分析一下这方面的问题。

  在java中,使用最频繁、同时也是滥用最多的一个类或许就是java.lang.String,它也是导致代码性能低下最主要的原因之一。请考虑下面这个例子:

String s1 = "Testing String";
String s2 = "Concatenation Performance";
String s3 = s1 + " " + s2;

  几乎所有的Java程序员都知道上面的代码效率不高。那么,我们应该怎么办呢?也许可以试试下面这种代码:

StringBuffer s = new StringBuffer();
s.append("Testing String");
s.append(" ");
s.append("Concatenation Performance");
String s3 = s.toString();

  这些代码会比第一个代码片段效率更高吗?答案是否定的。这里的代码实际上正是编译器编译第一个代码片段之后的结果。既然与使用多个独立的String对象相比,StringBuffer并没有使代码有任何效率上的提高,那为什么有那么多的Java书籍批评第一种方法、推荐使用第二种方法?

  第二个代码片段用到了StringBuffer类(编译器在第一个片段中也将使用StringBuffer类),我们来分析一下StringBuffer类的默认构造函数,下面是它的代码:

public StringBuffer() { this(16); }


  默认构造函数预设了16个字符的缓存容量。现在我们再来看看StringBuffer类的append()方法:

public synchronized StringBuffer append(String str) {
 if (str == null) { 
    str = String.valueOf(str);
  }
 int len = str.length();
 int newcount = count + len;
 if (newcount > value.length) expandCapacity(newcount);
 str.getChars(0, len, value, count);
 count = newcount; return this;
}

  append()方法首先计算字符串追加完成后的总长度,如果这个总长度大于StringBuffer的存储能力,append()方法调用私有的expandCapacity()方法。expandCapacity()方法在每次被调用时使StringBuffer存储能力加倍,并把现有的字符数组内容复制到新的存储空间。

  在第二个代码片段中(以及在第一个代码片段的编译结果中),由于字符串追加操作的最后结果是“Testing String Concatenation Performance”,它有40个字符,StringBuffer的存储能力必须扩展两次,从而导致了两次代价昂贵的复制操作。因此,我们至少有一点可以做得比编译器更好,这就是分配一个初始存储容量大于或者等于40个字符的StringBuffer,如下所示:

StringBuffer s = new StringBuffer(45);
s.append("Testing String");
s.append(" ");
s.append("Concatenation Performance");
String s3 = s.toString();

  再考虑下面这个例子:

String s = "";
int sum = 0;
for(int I=1; I<10; I++) {
  sum += I;
  s = s + "+" +I ;
 }
s = s + "=" + sum; 

声明:本站所发表的文章与图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系邮箱:editor@untx.com。

网盟藏经阁

平安奥运 安全网吧 平安奥运 安全网吧
  2008 年北京奥运会的脚步愈来愈近,在这场充满无限商机的全球性体育盛会和商业盛宴面前,网吧作为....[详情]
揭秘中型网吧如何应对网吧市场发展趋势 揭秘中型网吧如何应对网吧市场发展..
一、前言  现今,网吧行业正呈现网络规模扩大化的发展趋势,然而,并不是所有的网吧都可做到,那么如....[详情]
百年奥运 安全先行 百年奥运 安全先行
  作为世界三大竞技比赛的体育项目之一(奥运会、世界杯、F1)─奥运会无疑会成为世界的焦点,今夏即....[详情]
无盘网吧利好多多 无盘网吧利好多多
  中国人的无盘工作系统,大约在1997年走向社会,走进网吧。历经10多年的磨砺,无盘工作系统逐渐得到....[详情]
教你做网吧广告——百万格子网吧版 教你做网吧广告——百万格子网吧版
在网吧做广告已非新鲜事,但如何充分发挥网吧优势,“压榨”出更多的广告,想必大家也在绞尽脑汁了[详情]

百度主题推广

网站地图 | 关于天下 | 商务合作 | 广告投放 | 投稿指南 | 联系方式 | 友情链接 | 版权声明 | 免责条款 | 隐私保护
新 宽 联 数 码] 中国网吧增值业务领头羊
新宽联数码 2000 - 2008 建设 - 维护 - 版权所有 粤B2-20040365号
广州网监-报警岗亭