Java:将String中的所有字符代码移动一个常量值

Mir*_*ili 5 java arrays string shift character-codes

这有效:

for (char c : sourceString.toCharArray()) 
    destString += (char) (c + shiftValue);

System.out.println(destString);
Run Code Online (Sandbox Code Playgroud)

是否有更好/更快(优化)的方式?

Jon*_*eet 8

好吧,我开始避免使用重复的字符串连接.这是一个众所周知的性能问题.

在这种情况下,你知道你需要开始的确切长度,所以你甚至不需要StringBuilder- 一个char[]很好:

char[] result = new char[srcString.length()];
for (int i = 0; i < result.length; i++) {
    result[i] = (char) (srcString.charAt(i) + shiftValue);
}
String destString = new String(result);
Run Code Online (Sandbox Code Playgroud)

(使用toCharArray然后覆盖每个元素的答案也很好,虽然我希望任何性能差异都很小.如果这是真正的性能关键代码,你需要用你的实际系统进行测试.主要的一点是两者都是O(N)方法而不是O(N 2).)

但是,你应该考虑一下你是否真的只想换班 - 大多数这样的练习比轮班更多旋转,例如,如果你从AZ开始,你最终应该使用AZ ......换档值1应该改变Z到A,而不是"Z之后的Unicode字符"(即[).在您的情况下,这可能不是一个要求,但您当然应该考虑它.

  • @Andreas:我怀疑不是.我希望JIT编译器能够内联`charAt`,并且它避免创建一个新的数组......虽然Rafiduzzaman Sonnet的答案重用该数组作为结果数组,这很整洁(两者都避免了额外的内存使用量) ,以及内存使用本地化).如果这是绝对性能关键代码,我想非常仔细地对每个选项进行基准测试......但与避免重复连接的*巨大*增益相比,这里的增益可能非常小. (2认同)

son*_*net 6

更短的版本.无需charAt(i)每次都在循环中调用.

char[] result = srcString.toCharArray();
for (int i = 0; i < result.length; i++) {
    result[i] += shiftValue;
}
String destString = new String(result);
Run Code Online (Sandbox Code Playgroud)