之前有看到过java字符串反转效率的问题
今天分析下StringBuffer的reverse方法:
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("abcdef");
sb.reverse();
System.out.println(sb.toString());
}
结果:fedcba
先看第一步:
StringBuffer sb = new StringBuffer();
//默认长度是16
public StringBuffer()
{
super(16);
}
//父类中的方法StringBuffer继承了AbstractStringBuilder
AbstractStringBuilder(int i)
{
value = new char[i];
}
sb.append("abcdef");
//父类中的方法,如果append是null会默认字符串为“null”
public AbstractStringBuilder append(String s)
{
if(s == null)
s = "null";
int i = s.length();
ensureCapacityInternal(count + i);
s.getChars(0, i, value, count);
//count值为6
count += i;
return this;
}
第三步反转:
public AbstractStringBuilder reverse()
{
boolean flag = false;
int i = count - 1;
for(int j = i - 1 >> 1; j >= 0; j--)
{
char c = value[j];
char c2 = value[i - j];
if(!flag)
//确定给定char值是否为一个Unicode高/低代理项代码单元
flag = c >= '\uD800' && c <= '\uDFFF' || c2 >= '\uD800' && c2 <= '\uDFFF';
value[j] = c2;
value[i - j] = c;
}
if(flag)
{
for(int k = 0; k < count - 1; k++)
{
char c1 = value[k];
if(!Character.isLowSurrogate(c1))
continue;
char c3 = value[k + 1];
if(Character.isHighSurrogate(c3))
{
value[k++] = c3;
value[k] = c1;
}
}
}
return this;
}