Java资源网

| JAVA基础 | 环境配置 | JDBC | 线程技术 | Socket编程 | JavaMail | JAVA与XML | 设计模式 | 技术新闻 | Java认证 | 程序人生 软件下载
| JSP&Servlet | Spring | Struts | Hibernate | JBuilder | Eclipse | WebService | EJB技术 | J2ME开发 | 应用服务器 | JXTA | Ajax
Articles search文章搜索
   关键字:
   类 别:
       
New download 最新下载
· [组件]HTML Parser 1.5
· [教程]WebSphere Studio应用教程
· [组件]JDom 1.0
· [工具]Junit3.8.1
· [教程]EJB编程及J2EE系统架构和设计
· [教程]EJB教程
· [教程]J2EE Tutorial中文版
· [教程]Java编程思想2(英文)
· [教程]java编程思想(完整版)
· [教程]Java网络编程
New articles 最新文章
· 设计移动 Web 服务
· 解析XML的时候完全忽略DTD
· 理解XML Schema XML Schema 初步
· 标签库的深入研究
· 提升JSP应用程序的七大绝招
· 如何使用JDOM对XML文件进行操作
· 处理XML字符串中特殊字符
· 利用Digester把XML转换成为Java对象
· 使用WebService 和RMI远程协作
· 使用Axis开发Web Service程序
Articles top 热门文章
· Eclipse基础--plugin插件安装(6644)
· eclipse+tomcat+lomboz的安装配置说明(4774)
· Java程序员就业前景(4584)
· Windows下JAVA环境变量的设置祥解(3788)
· Tomcat下JSP、Servlet和JavaBean环境的配置(3716)
· 使用links方式安装Eclipse插件(3698)
· 一个老程序员的心理话(3533)
· linux下jdk的安装与配置(3459)
· 初学者入门:Structs中基本配置入门(3334)
· Eclipse 运行命令行参数大全(3084)
您的位置:首页>>JAVA基础>>使用String还是StringBuffer
使用String还是StringBuffer
2007-04-13   来源:www.javaresearch.org  作者:未知

出于方便的考虑,我们在进行字符串的内容处理的时候往往会出现以下的代码:
        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的使用。
下面给出一个完整的代码:
  1. public class Perf {
  2.   public static String detab1(String s)
  3.   {
  4.     if (s.indexOf('\t') == -1)
  5.       return s;
  6.     String res = "";
  7.     int len = s.length();
  8.     int pos = 0;
  9.     int i = 0;
  10.     for (; i < len && s.charAt(i) == '\t'; i++) 
  11.     {
  12.       res += "        ";
  13.       pos += 8;
  14.     }
  15.     for (; i < len; i++) 
  16.     {
  17.       char c = s.charAt(i);
  18.       if (c == '\t') {
  19.         do {
  20.           res += " ";
  21.           pos++;
  22.         } while (pos % 8 != 0);
  23.       }
  24.       else {
  25.         res += c;
  26.         pos++;
  27.       }
  28.     }
  29.     return res;
  30.   }
  31.       
  32.   public static String detab2(String s)
  33.   {
  34.     if (s.indexOf('\t') == -1)
  35.       return s;
  36.     StringBuffer sb = new StringBuffer();
  37.     int len = s.length();
  38.     int pos = 0;
  39.     int i = 0;
  40.     for (; i < len && s.charAt(i) == '\t'; i++) 
  41.     {
  42.       sb.append("        ");
  43.       pos += 8;
  44.     }
  45.     for (; i < len; i++) {
  46.       char c = s.charAt(i);
  47.       if (c == '\t') {
  48.         do {
  49.           sb.append(' ');
  50.           pos++;
  51.         } while (pos % 8 != 0);
  52.       }
  53.       else {
  54.         sb.append(c);
  55.         pos++;
  56.       }
  57.     }
  58.     return sb.toString();
  59.   }
  60.         
  61.   public static String testlist[] = {
  62.     "",
  63.     "\t",
  64.     "\t\t\tabc",
  65.     "abc\tdef",
  66.     "1234567\t8",
  67.     "12345678\t9",
  68.     "123456789\t"
  69.   };
  70.         
  71.   public static void main(String args[])
  72.   {
  73.     for (int i = 0; i < testlist.length; i++) {
  74.       String tc = testlist[i];
  75.       if (!detab1(tc).equals(detab2(tc)))
  76.         System.err.println(tc);
  77.      }
  78.         
  79.      String test_string =
  80.        "\t\tthis is a test\tof detabbing performance";
  81.      int N = 5000;
  82.      int i = 0;
  83.         
  84.      long ct = System.currentTimeMillis();
  85.      for (i = 1; i <= N; i++)
  86.        detab1(test_string);
  87.      long elapsed = System.currentTimeMillis() - ct;
  88.      System.out.println("String time = " + elapsed);
  89.          
  90.      ct = System.currentTimeMillis();
  91.      for (i = 1; i <= N; i++)
  92.        detab2(test_string);
  93.      elapsed = System.currentTimeMillis() - ct;
  94.      System.out.println("StringBuffer time = " 
  95.        + elapsed);
  96.    }
  97. }

执行以上代码的结果可以看到使用StringBuffer的版本的方法比使用String版本的一般都快十倍以上(本人使用的是JDK1.4.0),你可以执行一下看看结果到底如何。
因此得到的结论是:如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法好了!也许这就是你的程序的性能瓶颈!

  --相关文章--
· J2EE全面介绍(二) (2007-04-13)
· 项目经验二则:读取war包中的文件及Ant使用中的OutOfMemoryError解决 (2007-04-13)
· 走向J2EE,漫长的道路 (2007-04-13)
· 步入J2EE架构和过程(2) (2007-04-13)
· 步入J2EE架构和过程(1) (2007-04-13)
· 方兴未艾的CORBA (2007-04-13)

版权所有©2005-2006 JAVA资源网 渝ICP备05007591号 虚拟主机 | 关于我们 | 联系方式 | 广告业务 | 网站地图 | 友情链接