为什么StringBuffer
/StringBuilder
类中的reverse()
方法使用按位运算符?
我想知道它的优点。
public AbstractStringBuilder reverse() {
boolean hasSurrogate = false;
int n = count - 1;
for (int j = (n-1) >> 1; j >= 0; --j) {
char temp = value[j];
char temp2 = value[n - j];
if (!hasSurrogate) {
hasSurrogate = (temp >= Character.MIN_SURROGATE && temp <= Character.MAX_SURROGATE)
|| (temp2 >= Character.MIN_SURROGATE && temp2 <= Character.MAX_SURROGATE);
}
value[j] = temp2;
value[n - j] = temp;
}
if (hasSurrogate) {
// Reverse back all valid surrogate pairs
for (int i = 0; i < count - 1; i++) {
char c2 = value[i];
if (Character.isLowSurrogate(c2)) {
char c1 = value[i + 1];
if (Character.isHighSurrogate(c1)) {
value[i++] = c1;
value[i] = c2;
}
}
}
}
return this;
}
最佳答案
右移一位意味着除以二,我认为您不会注意到任何性能差异,编译器将在编译时执行这些优化。
许多程序员在除法而不是写 /2
时习惯右移两位,这是一种风格问题,或者也许有一天右移比实际除以更有效编写 /2
,(在优化之前)。编译器知道如何优化这样的东西,我不会浪费时间尝试编写其他程序员可能不清楚的东西(除非它们真的有所作为)。无论如何,循环等效于:
int n = count - 1;
for (int j = (n-1) / 2; j >= 0; --j)
正如@MarkoTopolnik 在他的评论中提到的,JDK 的编写根本没有考虑任何优化,这可以解释为什么他们明确地将数字右移一位而不是明确地除以它,如果他们考虑优化的最大功率,他们可能会写成 /2
。
以防万一你想知道为什么它们是等价的,最好的解释是通过例子,考虑数字 32。假设 8 位,它的二进制表示是:
00100000
右移一位:
00010000
其值为 16 (1 * 24)
关于java - 按位运算符在 StringBuilder 中的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28294794/