Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 424|回复: 0

[Java基础知识]使用String还是StringBuffer

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-1 12:59:26 | 显示全部楼层 |阅读模式
          出于方便的考虑,我们在进行字符串的内容处理的时候往往会出现以下的代码:


         
          
          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.     if (s.indexOf("        ") == -1)
    4.       return s;
    5.     String res = "";
    6.     int len = s.length();
    7.     int pos = 0;
    8.     int i = 0;
    9.     for (; i < len && s.charAt(i) == "        "; i++)
    10.      {
    11.       res += "        ";
    12.       pos += 8;
    13.     }
    14.     for (; i < len; i++)
    15.      {
    16.       char c = s.charAt(i);
    17.       if (c == "        ") {
    18.         do {
    19.           res += " ";
    20.           pos++;
    21.         } while (pos % 8 != 0);
    22.       }
    23.       else {
    24.         res += c;
    25.         pos++;
    26.       }
    27.     }
    28.     return res;
    29.   }
    30.    public static String detab2(String s){
    31.     if (s.indexOf("        ") == -1)
    32.       return s;
    33.     StringBuffer sb = new StringBuffer();
    34.     int len = s.length();
    35.     int pos = 0;
    36.     int i = 0;
    37.     for (; i < len && s.charAt(i) == "        "; i++)
    38.      {
    39.       sb.append("        ");
    40.       pos += 8;
    41.     }
    42.     for (; i < len; i++) {
    43.       char c = s.charAt(i);
    44.       if (c == "        ") {
    45.         do {
    46.           sb.append(" ");
    47.           pos++;
    48.         }
    49.      while (pos % 8 != 0);
    50.       }
    51.       else {
    52.         sb.append(c);
    53.         pos++;
    54.       }
    55.     }
    56.     return sb.toString();
    57.   }
    58. public static String testlist[] ={
    59.     "",
    60.     "        ",
    61.     "                        abc",
    62.     "abc        def",
    63.     "1234567        8",
    64.     "12345678        9",
    65.     "123456789        "
    66.   };
    67.   public static void main(String args[]){
    68.     for (int i = 0; i < testlist.length; i++) {
    69.       String tc = testlist[i];
    70.       if (!detab1(tc).equals(detab2(tc)))
    71.         System.err.println(tc);
    72.      }
    73.     String test_string =
    74.         "                this is a test        of detabbing performance";
    75.      int N = 5000;
    76.      int i = 0;
    77.      long ct = System.currentTimeMillis();
    78.      for (i = 1; i <= N; i++)
    79.        detab1(test_string);
    80.      long elapsed = System.currentTimeMillis() - ct;
    81.      System.out.println("String time = " + elapsed);
    82.      ct = System.currentTimeMillis();
    83.      for (i = 1; i <= N; i++)
    84.        detab2(test_string);
    85.      elapsed = System.currentTimeMillis() - ct;
    86.      System.out.println("StringBuffer time = "        + elapsed);
    87.    }
    88. }

    89.     程序运行结果:
    90. C:java>java   Perf
    91. String time = 290
    92. StringBuffer time = 30
    复制代码
    C:java

          执行以上代码的结果可以看到使用StringBuffer的版本的方法比使用String版本的一般都快十倍以上(本人使用的是JDK1.4.0),你可以执行一下看看结果到底如何。

    因此得到的结论是: 如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法好了!也许这就是你的程序的性能瓶颈!  
      
      


      
      
       
       

         
       

         
       
      

      

    源码下载:http://file.javaxxz.com/2014/10/1/125926125.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-1 20:12 , Processed in 0.421191 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表