在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);
}
答案 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类。为什么呢?