由于说,反转一个String对象是不可能的,因为Java中的字符串对象是不可变的。
你可以通过使用反射来访问底层数组来避开这个(见下面),但这不可取。
如果我们采取了一个问题,在char[]
(或任何其他阵列)的工作,相反,它变得容易:
/**
* reverses an array by swapping its elements.
*/
public static void reverse(char[] array) {
reverse(array, 0, array.length);
}
/**
* reverses a section of an array by swapping its elements.
* @param start the start of the section, inclusive
* @param end the end of the section, exclusive
*/
public static void reverse(char[] array, int start, int end) {
for(int i = start, j = end-1; i < j; i++, j--) {
swap(array, i, j);
}
}
/**
* swaps two array elements.
*/
private static void swap(char[] array, int i, int j) {
char help = array[i];
array[i] = array[j];
array[j] = help;
}
到这一点,我们现在也可以欺骗扭转现有的字符串:
public static void reverse(String s) {
Class<String> sClass = String.class;
char[] array = (char[])sClass.getDeclaredField("value").get(s);
int start = sClass.getDeclaredField("offset").getInt(s);
int len = sClass.getDeclaredField("count").getInt(s);
reverse(array, start, start+len);
}
至于说,这是不可取的,因为整个虚拟机和标准库是基于这样的事实,字符串是不可变的。此外,这里的字段名称取自1.6.0_13 Sun实现,其他虚拟机可能具有其他名称的这些字段,或以另一种方式存储字符串。
那么你的问题是什么? – 2011-05-09 11:48:21
你想实现字符串反向b'coz有一个函数称为** String.reverse(); ** – Ankit 2011-05-09 11:49:36
实际上它的StringBuilder.reverse(); – mglauche 2011-05-09 11:51:16