`
Leon.Wood
  • 浏览: 288251 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java中字符串链接性能比较

 
阅读更多

原帖地址:http://blog.csdn.net/bestseal/archive/2008/04/16/2296283.aspx

 

public static String concat1(String s1, String s2, String s3, String s4, String s5, String s6) {
        String result = "";
        result += s1;
        result += s2;
        result += s3;
        result += s4;
        result += s5;
        result += s6;
        return result;
    }

    public static String concat2(String s1, String s2, String s3, String s4, String s5, String s6) {
        StringBuffer result = new StringBuffer();
        result.append(s1);
        result.append(s2);
        result.append(s3);
        result.append(s4);
        result.append(s5);
        result.append(s6);
        return result.toString();
    }

    public static String concat3(String s1, String s2, String s3, String s4, String s5, String s6) {
        return new StringBuffer(s1.length() + s2.length() + s3.length() + s4.length() + s5.length() + s6.length())
                .append(s1).append(s2).append(s3).append(s4).append(s5).append(s6).toString();
    }

    public static String concat4(String s1, String s2, String s3, String s4, String s5, String s6) {
        return s1 + s2 + s3 + s4 + s5 + s6;
    }

    public static String concat5(String s1, String s2, String s3, String s4, String s5, String s6) {
        return new StringBuilder(s1.length() + s2.length() + s3.length() + s4.length() + s5.length() + s6.length())
                .append(s1).append(s2).append(s3).append(s4).append(s5).append(s6).toString();
    }

第一种写法是最土的写法,也最累赘,事实上看到这样的代码我都会有点头疼。看过《Effective Java》的朋友都知道用StringBuffer吧,用第二种写法的人应该也不少。第4种写法当然最简捷,最优美的了,就是不知道性能怎么样。Java 5里加了个StringBuilder类,与StringBuffer功能一样,就是没有同步,所有用StringBuilder代替 StringBuffer肯定对性能有好处,这样就产生的第5种写法。

还是做个测试有说服力。我的机器上同时装了JDK 5和JDK 6,两个都测了一下。执行每个函数10000000次(输入的每个参数都是"a"),各种写法用时如下,单位毫秒:

----------------------------------
我补充JDK 3:
[concat1] Time: <19656>
[concat2] Time: <4032>
[concat3] Time: <5671>
[concat4] Time: <4469>

我补充JDK 4:
[concat1] Time: <36265>
[concat2] Time: <12156>
[concat3] Time: <13860>
[concat4] Time: <12859>
-----------------------------------

JDK 5:
concat1: 13776
concat2: 5081
concat3: 4944
concat4: 4202
concat5: 4047

JDK 6:
concat1: 11801
concat2: 3930
concat3: 3976
concat4: 3353
concat5: 3440

可以看出第1种写法果然最慢,第二种写法由于用了StringBuffer,快了很多。奇怪的是第4种写法竟然也很快,比用 StringBuffer还快,怎么回事?其实如果你调试过字符串连接的执行过程就会知道当用第4种写法时Java会自动使用 StringBuilder.append()函数来进行连接。所以最简捷的第4种写法已经够快了。在JDK 5里,第5种写法最快,因为在创建StringBuilder的时候预先计算了总长度,消除了内存重分配。不过没有必要这么写,JDK 6里已经为第4种写法做了更好的优化,第5种写法反而慢了。

由此可见,采用最简单的第4种写法对于Java的实现来说优化的可能性越大。就像SQL一样,由于采用了陈述式的写法,优化器才有了优化的余地。想起了两句话:
1. 简单即美,谁都希望看到简洁明快的代码,不希望看到冗长乏味的代码
2. 性能优化是万恶之源

分享到:
评论

相关推荐

    JAVA的字符串拼接与性能

    如果你用”+”来连接固定长度的字符串,可能性能上会稍受影响,但是如果你是在 循环中来”+”多个串的话,性能将指数倍的下降。假设有一个字符串,我们将对这个字符串做大量循环拼接操作,使用”+”的话将得到最低的...

    java通用字符串连接

    在Java编程中,字符串连接是常见的操作,尤其是在处理集合数据如List、Set、Map和数组时。`java通用字符串连接`这个主题关注的是如何高效且灵活地将这些集合中的元素合并成一个单一的字符串,同时允许自定义连接分隔...

    java 创建字符串类

    - **字符串连接**:可以使用`+`运算符或`StringBuilder`/`StringBuffer`类来连接字符串。但`+`运算符在处理大量字符串连接时效率较低,因为它会在每次连接时创建新的`String`对象。 2. **StringBuffer与...

    Java中字符串的连接和比较.pdf

    本文主要讲解了Java中字符串连接的不同方式以及比较字符串的多种方法。 首先,我们来看字符串的连接。Java提供了多种方式来连接字符串: 1. **使用`+`运算符**:这是最直观的方式,`+`运算符可以用于连接字符串,...

    Java中字符串.pdf

    在Java编程语言中,字符串是一个至关重要的概念,它是由一个或多个字符组成的序列。字符串在内存中被视为不可变对象,即一旦创建,其内容就不能更改。Java标准库中的`java.lang`包提供了两个主要的字符串类:`String...

    Java中的字符串相关处理

    2. **字符串连接**:使用`+`运算符可以轻松地将两个字符串连接在一起。例如: ```java int age = 24; String s = "zhouyi is " + age + " old"; ``` 在这个例子中,整型变量`age`被自动转换为字符串并连接到...

    Java 字符串连接的性能问题分析

    Java 字符串连接的性能问题分析告诉我们,在大规模的场景中,使用 StringBuilder 替代 String,可以大幅度提高 Java 字符串连接的性能。但是,在小规模的场景中,使用 String 连接符也是合适的。

    java中的字符串处理

    3. **字符串连接**:Java支持使用`+`运算符连接字符串,例如: ```java String s1 = "Hello"; String s2 = "World"; String s3 = s1 + " " + s2; // 结果为 "Hello World" ``` 4. **连接字符串与其它数据类型*...

    JAVA 字符串 操作

    在Java编程语言中,字符串...以上只是Java字符串操作的一小部分,实际开发中还有许多其他方法和特性,如国际化(I18N)、正则表达式等,都需要程序员灵活掌握。理解并熟练运用这些操作,能有效提高代码质量和效率。

    java 给字符串编号

    3. **字符串连接**:在Java中,可以使用`+`操作符或者`StringBuilder.append()`方法将编号和字符连接起来。例如,`new StringBuilder().append(i).append(str.charAt(i))`可以在编号和字符之间添加连接。 4. **格式...

    JAVA 字符串应用笔记

    5. **字符串连接操作**: 在Java 5及以上版本,可以使用`+`操作符连接字符串,但在大量连接操作时,使用`StringBuilder`或`StringBuffer`更高效。 6. **常量池**: 字符串字面量会被放入常量池,如果两个字符串...

    JAVA的字符串拼接[参照].pdf

    通过字节码分析,可以更深入地了解为什么某些方法在性能上有显著差异,例如`+`操作符实际上会触发字符串连接操作的隐式转换,而`StringBuffer`和`StringBuilder`则利用了可变对象的特性来避免这种额外的开销。...

    java实验-字符串.docx

    总结来说,这个实验旨在帮助我们理解和掌握Java中字符串的基本操作,如获取长度、查找特定字符的次数,以及理解字符串比较和可变性在性能上的差异。通过实践,我们可以更好地运用这些知识来编写高效的Java代码。

    Java 实例 - 字符串性能比较测试源代码-详细教程.zip

    利用流可以实现简洁且高效的字符串处理,例如使用`Collectors.joining()`方法进行字符串连接。这种方法在处理大量数据时特别有用,因为它能够并行化操作,提高处理速度。 总之,通过本教程和提供的源代码,你将学习...

    java 插入新的字符串

    在Java编程语言中,插入新的字符串是一个常见的操作,特别是在处理文本数据时。本文将深入探讨如何在Java中插入新的字符串,主要围绕`StringBuffer`类进行讲解,因为它是线程安全且高效地处理字符串拼接的首选工具。...

    Java 实例 - 两种连接字符串方法的性能比较源代码-详细教程.zip

    本教程将深入探讨两种主要的字符串连接方式:`StringBuffer` 和 `StringBuilder`,并通过实例源代码进行性能比较。这两种类都是Java中用于构建和连接字符串的高效工具,尤其在循环或大量字符串操作时。 首先,我们...

    java 连接各种数据库的字符串

    ### Java连接各种数据库的字符串详解 在Java开发中,经常需要与不同的数据库进行交互来实现数据的存储和读取功能。为了确保应用能够顺利地访问这些数据库,我们需要正确配置数据库连接字符串及相关驱动程序。本文将...

    Java字符串连接效率[参照].pdf

    本文主要讨论了Java中的String、StringBuilder和StringBuffer三个类在字符串连接方面的性能差异。 首先,String类在Java中是不可变的,这意味着一旦创建,其值就不能改变。字符串常量存储在常量池中,这有助于节省...

    Java 字符串

    五、字符串连接 `String`类提供了`concat()`方法来连接两个字符串,但在频繁连接操作时,推荐使用`StringBuilder`或`StringBuffer`类,它们在多线程环境下更高效。 六、字符串与字符数组 可以使用`toCharArray()`将...

    Java 字符串与文本相关实例源码

    - 字符串连接:`+`运算符或`StringBuilder`/`StringBuffer`类。 - 字符串长度:`length()`方法。 - 子串提取:`substring()`方法。 - 查找子串:`indexOf()`,`lastIndexOf()`方法。 - 分割字符串:`split()`...

Global site tag (gtag.js) - Google Analytics