假如有字符串“asdfghjkl”,现将其反转为“lkjhgfdsa”
一种解法
将字符串转为字符数组
新建个相同长度的字符数组
将原数组的尾写给新数组的头,循环一遍
public static String reverseString(String str) {
char[] c = str.toCharArray();
int len = c.length;
char[] d = new char[len];
for(int i=len-1;i>=0;i--) {
d[len - 1 - i] = c[i];
}
return new String(d);
}
标准库提供的反转
String类没有提供反转的方法,但StringBuilder提供了
public static String reverseString(String str) {
StringBuilder sb = new StringBuilder(str);
StringBuilder sbReverse=sb.reverse();
return sbReverse.toString();
}
那源码中是如何实现的呢?具体的实现方法在AbstractStringBuilder类中,下面是源码
public AbstractStringBuilder reverse() {
boolean hasSurrogates = false;
int n = count - 1; //n表示最大索引号
for (int j = (n-1) >> 1; j >= 0; j--) { //从该字符数组的中间开始到两头进行对称交换
int k = n - j; //上一行j=(n-1)>>1,n之所以减1可以避免奇数个元素的情况,中间个元素自己跟自己交换
char cj = value[j];
char ck = value[k];
value[j] = ck;
value[k] = cj;
if (Character.isSurrogate(cj) ||
Character.isSurrogate(ck)) {
hasSurrogates = true;
}
}
if (hasSurrogates) {
reverseAllValidSurrogatePairs();
}
return this;
}