Apache Commons StringUtils.repeat()如何工作以及为什么它以这种方式工作?

时间:2015-03-22 00:29:06

标签: java apache apache-commons

我今天刚开始使用apache-commons库并发现他们写repeat()的方式很有趣

这是该方法的源代码:

public static String repeat(final String str, final int repeat) {
    if (str == null) {
        return null;
    }
    if (repeat <= 0) {
        return EMPTY;
    }
    final int inputLength = str.length();
    if (repeat == 1 || inputLength == 0) {
        return str;
    }
    if (inputLength == 1 && repeat <= PAD_LIMIT) {
        return repeat(str.charAt(0), repeat);
    //here the author use FOR loop with char[]
    }

    final int outputLength = inputLength * repeat;
    switch (inputLength) {
        case 1 :
            return repeat(str.charAt(0), repeat);
        case 2 :
            final char ch0 = str.charAt(0);
            final char ch1 = str.charAt(1);
            final char[] output2 = new char[outputLength];
            for (int i = repeat * 2 - 2; i >= 0; i--, i--) {
                output2[i] = ch0;
                output2[i + 1] = ch1;
            }
            return new String(output2);
        default :
            final StringBuilder buf = new StringBuilder(outputLength);
            for (int i = 0; i < repeat; i++) {
                buf.append(str);
            }
            return buf.toString();
    }
}

我只是想知道他们将重复分成几个案例的原因是什么?表演有什么关系吗? 如果我被要求写'repeat()',我将只使用append()

的FOR循环

我想知道通过查看作者如何编写代码可以学到什么。

1 个答案:

答案 0 :(得分:1)

似乎作者已经针对他们认为/知道常见的几个用例优化了该方法:单字符和双字符输入字符串。

这是一个很好的例子,为什么使用框架(例如Commons Lang)进行这种字符串操作是有益的。 API将隐藏实现细节,这些细节并非总是惯用或易于向您或您的同事阅读,但可能会提高性能。