Diğerlerinin işaret ettiği gibi, tercih edilen yol kullanmaktır:
new StringBuilder(hi).reverse().toString()
Ancak bunu kendiniz uygulamak istiyorsanız, geri kalan cevapların kusurları olduğundan korkuyorum.
Bunun nedeni, değişken uzunluklu kodlamaya göre bir dizide kodlanan Unicode noktalarının String
bir listesini temsil etmesidir: UTF-16 .char[]
Bu, bazı kod noktalarının dizinin tek bir öğesini (bir kod birimi) kullandıkları, ancak diğerlerinin ikisini kullandıkları anlamına gelir, bu nedenle tek bir birim (ardışık "yüksek" ve "düşük" taşıyıcılar) olarak ele alınması gereken karakter çiftleri olabilir .
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"));
}