字符串方法 -​​ 数组或不数组?

时间:2015-07-26 18:17:18

标签: java arrays string performance

String上进行计算时,最好将它们转换为char数组,然后对它们进行处理吗?那么所有String问题都是阵列问题吗?

例如,在性能方面,哪种方法更好?有什么优点/缺点?

public static String repeatEnd1(String str, int n) {
    StringBuilder sb = new StringBuilder();
    if (n <= str.length()) {
        String lastChars = str.substring(str.length() - n);
        for (int i = 0; i < n; i++) {
            sb.append(lastChars);
        }
    }
    return sb.toString();
}

public static String repeatEnd2(String str, int n) {
    if (n > str.length()) {
        return str;
    }
    char[] chars = str.toCharArray();
    char[] lastN = Arrays.copyOfRange(chars, chars.length - n, chars.length);
    char[] nLastN = new char[n * n];
    int i = 0, j = 0;
    while (i < nLastN.length) {
        if (j > n - 1) {
            j = 0;
        }
        nLastN[i++] = lastN[j++];
    }
    return String.valueOf(nLastN);
}

3 个答案:

答案 0 :(得分:1)

subString()在内部创建一个新的String,它使用Arrays.copyOf()(再次使用System.arrayCopy()复制数组。

话虽如此,JIT提供了arrayCopy()自己的内在实现,因此您的Arrays.copyOf可能会被替换。

从概念上讲,第二个选项应该比第一个选项更快,因为它只处理基本类型(尽管它们不是完全基元,但是数组可以包含在这个类别中)。

如果您正在使用同步,那么使用字符串会更好,因为JIT会删除字符串上不需要的同步,因为它们是不可变的。

答案 1 :(得分:0)

我认为保留String原样 - 只有在真正需要时才转换为char数组。在你给出的例子中,第一个很好。无需将其转换为char数组。但有些情况下,我知道使用char数组很重要 - 例如representing password。在这种情况下,您可以将它们转换为char数组。

答案 2 :(得分:0)

我更喜欢使用String类。为什么呢?

  1. 它比char数组简单易行
  2. 您可以轻松更改字符集
  3. 它涵盖了我的所有问题,而且越来越多