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

Java中使用+作为字符串连接符,它是把多个字符串合并成一个字符串的方便途径。对于单独一行的输出、或者较小的大小固定对象,使用连接符方便且合适。但是对于大规模的场景,字符串连接符变得有些不合时宜。

以连接N个字符串为列,重复的使用字符串连接符需要N的平方的时间量,最主要的原因是String类是不可变类导致的,即当连接两个字符串时,它们的内容都要存在一次拷贝。每一次连接,原有的两个字符串对象都不变,连接后的结果是一个新生成的对象。这种方式,不仅时间需求很大,而且对内存的要求也非常高。

如果拼接的字符串很多,使用字符串连接符的计算时间和对性能的消耗变得难以估算。为了使性能在接受范围内,可以使用StringBuilder替代String,来连接字符串。

以下是两种方式的测试代码:

<span style="font-size:18px;">public static void main(String[] args) { 

    long start1 = System.currentTimeMillis();
    String result1 ="";
    for(int i = 0 ; i < 50000;i++){
      result1 += String.valueOf(i);
    }
    long end1 = System.currentTimeMillis();
    System.out.println("String Connect Time:"+(end1-start1)+"ms"); 

    long start2 = System.currentTimeMillis();
    StringBuilder result2 = new StringBuilder();
    for(int i = 0 ; i < 50000;i++){
      result2.append(i);
    }
    long end2 = System.currentTimeMillis();
    System.out.println("StringBulider Connect Time:"+(end2-start2)+"ms");
  }</span>

这两中做法的差距非常大,我所做的测试中,第二种做法要比第一种做法高4到5个数量级。随着连接数目的增多,两种方式的性能差距也更加明显。

总结一下:不要使用字符串连接符来连接多个字符串,除非系统对性能无要求。还有一点是,可以使用字符数组,或者每次只处理一个字符串,而不是将他们组合起来。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • java判断字符串String是否为空问题浅析

    一.判断一个字符串str不为空的方法有: 1.str == null;2."".equals(str);3.str.length <= 0;4.str.isEmpty();注意:length是属性,一般集合类对象拥有的属性,取得集合的大小.            例如:数组.length就是取得数组的长度.          length()是方法,一般字符串类对象有该方法,也是取得字符串长度.            例如:字符串.length();说明:  1.null表示这个

  • java拼接字符串时去掉最后一个多余逗号的方法

    本文实例讲述了java拼接字符串时去掉最后一个多余逗号的方法.分享给大家供大家参考.具体分析如下: 先看下面这段代码: for (int t = 0; t < memberLen; t++) { memTemp = stafferMap.get(strMember[t]); if(memTemp != null){ memberNames += memTemp + ","; } } 以上的代码,拼接的字符串会多一个",",比如:"str1,str2,

  • Java生成MD5加密字符串代码实例

    (1)一般使用的数据库中都会保存用户名和密码,其中密码不使用明码保存.     有时候用MD5密码,很多语言都提供了将字符串生成为MD5密码的方法或函数.MD5的加密算法是公开的.     有时候也可以用自己的字符串加密算法,这种加密算法是只有自己知道的. (2)破解MD5的过程就是先算好大量或者所有可能的字符串的MD5数值,之后进行查询就可以破解.虽然有些网站规定了密码的位数在6~20位之间,但是要事先计算这么多是字符串并有效的组织存储.查询还是相当麻烦,相当慢的. 因为MD5的位数是固定的,

  • java去除字符串中的空格、回车、换行符、制表符的小例子

    复制代码 代码如下: import java.util.regex.Matcher;import java.util.regex.Pattern; /** * @author lei * 2011-9-2 */public class StringUtils { public static String replaceBlank(String str) {        String dest = "";        if (str!=null) {            Patte

  • 用Java正则去掉字符串中重复出现的字符

    String str = "abcdeabcdeabcdeaaaaaadddddceeeeabcccccccacadaeec"; str = str.replaceAll(reg, ""); System.out.println(str); str = str.replaceAll("(?s)(.)(?=.*\\1)", ""); (?s)(.)(?=.*\1) (?s) 开启单行模式 DOTALL 让. 号匹配任意字符 (.

  • java 字符串匹配函数

    去掉字符串中匹配 的字符串 复制代码 代码如下: /** * 去掉字符串中匹配 的字符串 * * @author zhujie * @return String regex 要替换的内容 value 字符串 state 替换的内容变成什么 */ public static String toRegex(String regex, String value, String state) { Pattern p = Pattern.compile(regex); Matcher m = p.matc

  • Java实现字符串倒序输出的常用方法小结

    本文实例汇总了Java实现字符串倒序输出的常用方法,分享给大家供大家参考.具体方法如下: 1. 最容易想到的估计就是利用String类的toCharArray(),再倒序输出数组的方法了. 实现代码如下: import javax.swing.JOptionPane; public class ReverseString { public static void main (String args[]){ String originalString; String resultString =

  • Java判断字符串中是否包含中文方法

    今天和同事在讨论一个问题,需要检查"输入的字符串中是否包含中文",刚开始想到是用正则表达式,正则表达式中是以[u4e00-u9fa5]来全匹配字符是否是中文,但现在面临的问题是这个字符串中还可能包含英文字符.数字.特殊字符,一时也没想出能匹配该场景的正则表达式,后来在网上搜了下,可以使用Matcher类来解决该问题,大致的代码实现如下: import java.util.regex.Matcher; import java.util.regex.Pattern; public clas

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

    Java中使用+作为字符串连接符,它是把多个字符串合并成一个字符串的方便途径.对于单独一行的输出.或者较小的大小固定对象,使用连接符方便且合适.但是对于大规模的场景,字符串连接符变得有些不合时宜. 以连接N个字符串为列,重复的使用字符串连接符需要N的平方的时间量,最主要的原因是String类是不可变类导致的,即当连接两个字符串时,它们的内容都要存在一次拷贝.每一次连接,原有的两个字符串对象都不变,连接后的结果是一个新生成的对象.这种方式,不仅时间需求很大,而且对内存的要求也非常高. 如果拼接的字

  • 你必须知道的JavaScript 中字符串连接的性能的一些问题

    而JavaScript的核心是ECMAScript .与其他语言类似,ECMAScript 的字符串是不可变的,即它们的值不能改变. 请考虑下面的代码: 复制代码 代码如下: var str = "hello ";str += "world";实际上,这段代码在幕后执行的步骤如下: 1.创建存储 "hello " 的字符串.2.创建存储 "world" 的字符串.3.创建存储连接结果的字符串.4.把 str 的当前内容复制到结

  • 再论Javascript下字符串连接的性能

    1 如何进行字符串连接? 首先让我们来回顾一下字符串连接的两种常用方法: 1.1 使用字符串连接运算符 常用的语言(如Java.C#.PHP等)都有字符串连接运算符,Javascript也不例外,代码示例: 复制代码 代码如下: var str = ""; str = str + "a"; 1.2 使用数组 在常用的语言中,字符串连接运算的性能普遍不高,为此在C#中就专门提供了StringBuilder(Java中提供了StringBuffer)用于连接字符串.而在

  • javascript 字符串连接的性能问题(多浏览器)

    书中附带的测试代码如下  复制代码 代码如下: <html> <head> <title>Example</title> </head> <body> <p><strong>Note:</strong> The latest versions of Firefox seem to have fixed the string concatenation problem. If you are usin

  • VBS中的字符串连接的性能问题

    当然,对于少量的字符串连接,效率并没有对程序造成多大影响,现在让我们考虑一个极端的问题:将1到100000之间的所有数字连接成一个字符串. 最简单的解决方案是直接使用&连接: 复制代码 代码如下: begin = Timer For i = 1 To 100000 str = str & CStr(i) Next WScript.Echo str finish = Timer WScript.Echo finish - begin 但是这个程序在我电脑上需要运行60.648秒,效率太低.换

  • java字符串拼接与性能分析详解

    假设有一个字符串,我们将对这个字符串做大量循环拼接操作,使用"+"的话将得到最低的性能.但是究竟这个性能有多差?如果我们同时也把StringBuffer,StringBuilder或String.concat()放入性能测试中,结果又会如何呢?本文将会就这些问题给出一个答案! 我们将使用Per4j来计算性能,因为这个工具可以给我们一个完整的性能指标集合,比如最小,最大耗时,统计时间段的标准偏差等.在测试代码中,为了得到一个准确的标准偏差值,我们将执行20个拼接"*"

  • 温故知新——JavaScript中的字符串连接问题最全总结(推荐)

    ECMAScript 中最常见的一个问题是字符串连接的性能.与其他语言类似,ECMAScript 的字符串是不可变的,即它们的值不能改变.请考虑下面的代码: var str = "hello "; str += "world"; 实际上,这段代码在幕后执行的步骤如下: 1.创建存储 "hello " 的字符串. 2.创建存储 "world" 的字符串. 3.创建存储连接结果的字符串. 4.把 str 的当前内容复制到结果中.

  • Java字符串拼接的五种方法及性能比较分析(从执行100次到90万次)

    目录 > 源代码,供参考 > 测试结果: > 查看源代码,以及简单分析 > 字符串拼接一般使用"+",但是"+"不能满足大批量数据的处理,Java中有以下五种方法处理字符串拼接,各有优缺点,程序开发应选择合适的方法实现. 1. 加号 "+" 2. String contact() 方法 3. StringUtils.join() 方法 4. StringBuffer append() 方法 5. StringBuilder

  • java 字符串内存分配的分析与总结(推荐)

    经常在网上各大版块都能看到对于java字符串运行时内存分配的探讨,形如:String a = "123",String b = new String("123"),这两种形式的字符串是存放在什么地方的呢,其实这两种形式的字符串字面值"123"本身在运行时既不是存放在栈上,也不是存放在堆上,他们是存放在方法区中的某个常量区,并且对于相同的字符串字面值在内存中只保留一份.下面我们将以实例来分析. 1.==运算符作用在两个字符串引用比较的两个案例: p

  • Java 并行数据处理和性能分析

    并行流 并行流是一个把元素分成多个块的流,每个块用不同的线程处理.可以自动分区,让所有的处理器都忙起来. 假设要写一个方法,接受一个数量n做参数,计算1-n的和.可以这样实现: public long sequentialSum(long n) { return Stream.iterate(1L, i -> i + 1) .limit(n) .reduce(0L, Long::sum); } 也许可以使用parallel方法,简单地使用并行计算,提高程序性能: public long sequ

随机推荐