最快和最快格式化String的最有效方法

时间:2011-09-09 02:24:16

标签: java string string-matching

在Java中将日期为格式为“20110913”的字符串转换为“2011-09-13”的最快方法是什么。

3 个答案:

答案 0 :(得分:5)

使用java.text.DateFormat

DateFormat inputFormat = new SimpleDateFormat("yyyyMMdd");
inputFormat.setLenient(false);
DateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd");
Date inputDate = inputFormat.parse("20110913);
System.out.println(outputFormat.format(inputDate));

答案 1 :(得分:4)

我做了一些简单的分析,发现了一些有趣的结果。

public static String strcat(String ori){
    return ori.substring(0, 4) + '-' + ori.substring(4, 6) + '-' + ori.substring(6);
}

public static String sdf(String ori){
    try {
        SimpleDateFormat in = new SimpleDateFormat("yyyyMMdd");
        SimpleDateFormat out = new SimpleDateFormat("yyyy-MM-dd");
        Date temp = in.parse(ori);
        return out.format(temp);
    } catch (ParseException ex) {
        Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}

public static String sb(String ori){
    return new StringBuilder(10).append(ori.substring(0, 4)).append('-').append(ori.substring(4, 6)).append('-').append(ori.substring(6)).toString();
}

public static String nio(String ori){
    byte[] temp = ori.getBytes();
    ByteBuffer bb = ByteBuffer.allocate(temp.length + 2);
    bb.put(temp, 0, 4);
    byte hyphen = '-';
    bb.put(hyphen);
    bb.put(temp, 4, 2);
    bb.put(hyphen);
    bb.put(temp, 6, 2);
    return new String(bb.array());
}

public static String qd(String ori){
    char[] result = new char[10];
    result[4] = result[7] = '-';

    char[] temp = ori.toCharArray();
    System.arraycopy(temp, 0, result, 0, 4);
    System.arraycopy(temp, 4, result, 5, 2);
    System.arraycopy(temp, 6, result, 8, 2);
    return new String(result);
}

public static void main(String[] args) {
    String ori = "20110913";
    int rounds = 10000;
    for (int i = 0; i < rounds; i++) {
        qd(ori);
        nio(ori);
        sb(ori);
        sdf(ori);
        strcat(ori);
    }
}

通过以上几种方法,我运行了三次测试,结果(平均值)如下: -

sb      15.7ms
strcat  15.2ms
qd      27.2ms
nio     137.6ms
sdf     582ms

使用JDK 7运行测试。请注意,这不是一个广泛的分析,因为可以进行大量优化(例如,缓存SimpleDateFormat,StringBuilder)。此外,此测试不是多线程的。所以,做个自己的程序! 附: strcat比sb更快不是我的预期。我想编译器优化在这里发挥了重要作用。

答案 2 :(得分:0)

使用StringBuilder,在它们之间插入插入' - '字符的子字符串。