java 字符串拼接的单元测试

整体内容介绍

本文分为几个部分:

* String、StringBuffer、StringBuilder的对比

* 字符串拼接方式的对比

使用到的内容:

* Junit4单元测试

* slf4j的日志框架

String、StringBuffer、StringBuilder的对比

对于这三者使用的场景做如下概括(参考:《编写搞质量代码:改善java程序的151个建议》):

  1. String:在字符串不经常变化的场景中可以使用String类,如:常量的声明、少量的变量运算等。
  2. StringBuffer:在频繁进行字符串的运算(拼接、替换、删除等),并且运行在多线程的环境中,则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装等。
  3. StringBuilder:在频繁进行字符串的运算(拼接、替换、删除等),并且运行在多线程的环境中,则可以考虑使用StringBuffer,如SQL语句的拼装、JSON封装等(貌似这两个我也是使用|StringBuffer)。

字符串拼接方式对比

package com.zy.util;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestString {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    @Test
    public void testPlus() {
        String s = "";
        long ts = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            s = s + String.valueOf(i);
        }
        long te = System.currentTimeMillis();
        //System.out.println("+ cost {} ms:"+(te-ts));
        logger.info("+ cost {} ms", te - ts);
    }
    @Test
    public void testConcat() {
        String s = "";
        long ts = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            s = s.concat(String.valueOf(i));
        }
        long te = System.currentTimeMillis();
        //System.out.println("concat cost {} ms:"+(te-ts));
        logger.info("concat cost {} ms", te - ts);
    }

    @Test
    public void testStringBuffer() {
        StringBuffer sb = new StringBuffer();
        long ts = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            sb.append(String.valueOf(i));
        }
        sb.toString();
        long te = System.currentTimeMillis();
        //System.out.println("StringBuffer cost {} ms:"+(te-ts));
        logger.info("StringBuffer cost {} ms", te - ts);
    }
    @Test
    public void testStringBuilder() {
        StringBuilder sb = new StringBuilder();
        long ts = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            sb.append(String.valueOf(i));
        }
        sb.toString();
        long te = System.currentTimeMillis();
        //System.out.println("StringBuilder cost {} ms:"+(te-ts));
        logger.info("StringBuilder cost {} ms", te - ts);
    }
}

上述程序结果如下:

2015-6-9 16:01:58 com.zy.util.TestString testPlus
信息: + cost 504 ms
2015-6-9 16:01:58 com.zy.util.TestString testConcat
信息: concat cost 196 ms
2015-6-9 16:01:58 com.zy.util.TestString testStringBuffer
信息: StringBuffer cost 2 ms
2015-6-9 16:01:58 com.zy.util.TestString testStringBuilder
信息: StringBuilder cost 2 ms

可以看出,+和concat的方式速度较慢,需要创建新串。

而StringBuffer和StringBuilder较快。

参考资源

不足地方

  • 使用javap进行反编译,具体再做分析
时间: 2024-07-31 16:10:46

java 字符串拼接的单元测试的相关文章

羞,Java 字符串拼接竟然有这么多姿势

二哥,我今年大二,看你分享的<阿里巴巴 Java 开发手册>上有一段内容说:"循环体内,拼接字符串最好使用 StringBuilder 的 append 方法,而不是 + 号操作符."到底为什么啊,我平常一直就用的'+'号操作符啊!二哥有空的时候能否写一篇文章分析一下呢? 就在昨天,一位叫小菜的读者微信我说了上面这段话. 我当时看到这条微信的第一感觉是:小菜你也太菜了吧,这都不知道为啥啊!我估计正在读这篇文章的你也会有同样的感觉. 但扪心自问,在我做程序员的前两年内,我也不

java字符串拼接技巧(StringBuilder使用技巧)

在平时的开发中,我们可能会遇到需要拼接如下格式的字符串(至少我是遇到了很多次): 1,2,3,4,5,6,7,8,9,10,11,12,12,12,12,34,234,2134,1234,1324,1234,123 这个字符串的特点:多个数据之间通过某一个特殊符号分割. 以前我都是这样想的,我相信很多的people也是这样想的: public class StringTest { public static void main(String[] args) { StringBuilder sb

java字符串拼接的几种方式

1. + 方式 String str1="hello"; String str2="world"; String str=str1+str2; 2. concat方式 当两个量都为String类型且值不为null时,可以用concat方式 String a="a"; String b="b"; String c= a.concat(b); 理论上,此时拼接效率应该最高,因为已经假定两个量都为字符串,做底层优化不需要额外判断或转

Java字符串拼接新方法 StringJoiner

Java中如何输出像1-2-3-4-5 这样的字符 抱歉对于这个问题我甚至不能想到一个合适的标题,但是不重要 以下操作基于 jdk 1.8 StringJoiner sj = new StringJoiner("-", "", ""); sj.add("1").add("1").add("2"); String desiredString = sj.toString(); 在1.8版本中

【转】Java 5种字符串拼接方式性能比较。

最近写一个东东,可能会考虑到字符串拼接,想了几种方法,但对性能未知,于是用Junit写了个单元测试. 代码如下: import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TestS

LotusScript提升大字符串拼接函数(功能类似java中StringBuffer)

LotusScript提升大字符串拼接函数(功能类似java中StringBuffer),代码如下: Class StringBuffer Public count As Integer Private arr() As String Private size As Integer Private increment As Integer Sub New(Byval a As Integer) Redim arr(a) increment=a count=0 End Sub Sub add(By

java 创建string对象机制 字符串缓冲池 字符串拼接机制 字符串中intern()方法

字符串常量池:字符串常量池在方法区中 为了优化空间,为了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,每当代码创建字符串常量时,JVM会首先检查字符串常量池.如果字符串已经存在池中,就返回池中的实例引用.如果字符串不在池中,就会实例化一个字符串并放到池中.Java能够进行这样的优化是因为字符串是不可变的,可以不用担心数据冲突进行共享.所以,在常量池中的这些字符串不会被垃圾收集器回收 1.String str = new String("hello");此时创建的2个对象

java中字符串拼接 String 和 StringBuilder(StringBuffer)的使用

字符串拼接是个常用的功能,经常性使用String做字符串拼接,当拼接次数多的时候,使用String方法会消耗大量的性能和时间,因为每次String拼接时都会建立一个新的对象,随着拼接次数的增多,性能消耗.时间消耗会大量增加,这个时候应该使用StringBuilder方法. 1 public static void main(String[] args) { 2 try { 3 int count = 500; 4 5 long begin = System.currentTimeMillis()

[Java Performance] 字符串拼接注意事项

字符串拼接(String Concatenation) // 编译器优化前 String answer = integerPart + "." + mantissa; // 编译器优化后 String answer = new StringBuilder(integerPart).append(".").append(mantissa).toString(); 因为编译器会对字符串的拼接操作进行优化,所以在同一条语句中使用字符串拼接操作对性能并没有负面影响.正因为编