Como outros já apontaram, a maneira preferida é usar:
new StringBuilder(hi).reverse().toString()
Mas se você quiser implementar isso sozinho, receio que o restante das respostas tenha falhas.
O motivo é que String
representa uma lista de pontos Unicode , codificados em uma char[]
matriz de acordo com a codificação de comprimento variável: UTF-16 .
Isso significa que alguns pontos de código usam um único elemento da matriz (uma unidade de código), mas outros usam dois deles; portanto, pode haver pares de caracteres que devem ser tratados como uma única unidade (substitutos "altos" e "baixos" consecutivos) .
public static String reverseString(String s) {
char[] chars = new char[s.length()];
boolean twoCharCodepoint = false;
for (int i = 0; i < s.length(); i++) {
chars[s.length() - 1 - i] = s.charAt(i);
if (twoCharCodepoint) {
swap(chars, s.length() - 1 - i, s.length() - i);
}
twoCharCodepoint = !Character.isBmpCodePoint(s.codePointAt(i));
}
return new String(chars);
}
private static void swap(char[] array, int i, int j) {
char temp = array[i];
array[i] = array[j];
array[j] = temp;
}
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("C:/temp/reverse-string.txt");
StringBuilder sb = new StringBuilder("Linear B Syllable B008 A: ");
sb.appendCodePoint(65536); //http://unicode-table.com/es/#10000
sb.append(".");
fos.write(sb.toString().getBytes("UTF-16"));
fos.write("\n".getBytes("UTF-16"));
fos.write(reverseString(sb.toString()).getBytes("UTF-16"));
}