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; } /** * 'abc defg'; * count = 7-1; * n=6 * * j == 3; * * temp = 'd'; j = 3 * temp2 = 'd'; n-j = 3 * temp[3] = 'd'; * temp[3] ='d'; * * j == 2; * temp = 'c'; j=2 * temp = 'e'; n-j = 4 * temp[2] = 'e'; * temp[5] = 'c'; * * j == 1; * temp = 'b'; j=1 * temp2 = 'f'; n-j = 5 * temp[1] = 'f'; * temp[6] = 'b'; * * j == 0; * temp[6] = 'a'; * temp = 'a'; j=0 * temp2 = 'g'; n-j = 6; * temp[0] = 'g'; * temp[6] = 'a'; **/