我们知道在jdk1.4中对String的处理不是太好,编译器为每一个字符串常量开辟一个空间,String的不变性的机制显然会在String常量内有大量的冗余。所以我们在处理大量的字符串连接时,而且要求性能时,我们都是使用StringBuffer,而不使用String。我想请教的是,在jdk1.5及其以上版本中,改问题有没有得到解决,我曾经看过一篇文章,说道过这个问题,说1.5中该问题已经解决了,但是我不知道到底怎么样啊,这个文章在这里:
http://www.tolover.cn/index.php/archives/262请教高手啊,在jdk1.5中,是不是可以不用在意String的链接运算,不需要用StringBuffer代替String使用了,因为我现在做的项目中开始没有注意这个问题,所以要把String链接的地方替换成StringBuffer,工作量那是相当的大啊。项目已经卡在这里了,不敢决定是否要处理String的问题,紧急求救啊。磕头感谢,紧急紧急。

解决方案 »

  1.   

    即使是的1.4的时候,处理string连接也不会导致性能上的问题1.5以上可以不用考虑这个问题。
      

  2.   

    实验一下最能说明问题了,参考一下这里:http://blog.csdn.net/sunshinestation/archive/2009/04/09/4058973.aspx, 应该还是有差别的。 
      

  3.   

    非常感谢各位前辈的指教,真是雪中送炭啊,java号称最面向对象的语言,第一次使用java的时候,看到String类,觉得很好,心想,java吗,肯定各种安全性都考虑到了,压根没想过String在字符串链接中有可能会出现的性能问题,后来无意的看到一篇说明String的文章,一搜,才发现网上关于java String的论述铺天盖地,说的我心里也没有底了,现在既然各位前辈都说String链接没问题,那就是没问题了。呵呵,我心里还是没有底啊,各位前辈,String在字符串链接时,真的不会产生冗余吗?麻烦前辈再次给我确认一下,真的没问题吗?如果真没问题,后我就再也不考虑这个问题了。
      

  4.   


    大量string相加还是非常少见的。在实际开发中,10来个相加都算多了,对于现在的机器来说,这个代码性能上的差异基本不用考虑。
      

  5.   

    2楼的例子只是说明问题的存在,是否要改,还是要看你自己的代码。你测试下你的代码,看性能是否就相差那么大?10来次的运算和1w次的for循环运算,本身就有非常大的差异。
      

  6.   

    这个问题确实还是要自己解决。大量的字符串连接在任何java版本里都是需要用 StringBuffer或StringBuilder的。
    StringBuilder更好一些。
    StringBuffer支持线程安全,但这一特性完全是个多余的东西。
      

  7.   

    1.4也不用特殊处理吧,记得1.4用StringBuffer,1.5不过是使用了新增的StringBuilder。是否需要自己特殊处理看实际的需要。
    比如只是简单的
    String result = a + b + c + d +***+ z;
    这样一些字符串的链接的话,没有必要自己再用StringBuilder或者StringBuffer来处理链接,因为编译器会帮我们处理,而且代码看起来更优雅。但是如果你的程序类似这样,要通过大量的循环来链接字符串:String str = "";
            for(int i = 0; i < 100; i++){
                str += i;
            }
    那就很有必要适合这样处理:String str = "";
    StringBuilder builder = new StringBuilder();
            for(int i = 0; i < 100; i++){
                builder.append(i);
            }
            str = builder.toString();因为循环的情况中编译器是在每次循环插入一个StringBuilder对象,这就不如我们自己的代码优化了。
      

  8.   

    个人感觉,两个在用在不同的场合
    如果只是使用一个单独的字符串或简单的几个字符串连接
    就用String ,更快
    但如果连接次数我了
    就用StringBuffer吧
      

  9.   

    去看看《深入JAVA虚拟机》可能会得到答案哦。