StringBuffer中的reverse源码分析

之前有看到过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;
    }


反转的循环是从中间开始的,然后下标值对称替换,这样循环次数会少一些。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值