StringBuffer、StringBuilder源码阅读

 引子:工作之余,抽空心血来潮想看下StringBuffer、StringBuilder的源码,看看他是怎么附加字符串而不生成新的对象  

         字符内容用Char[] 数组存储

        这两个对象有一个共同的父类AbstractStringBuilder

         在进行append添加字符的时候是引用的父类方法

           public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }

 至于Buffer线程安全 ,Builder非线程的关键点就在于Buffer的方法用synchronized同步锁修饰而Builder没有

父类AbstractStringBuilder的append方法:

        public AbstractStringBuilder append(String str) {
        if (str == null)
            return appendNull();
        int len = str.length();
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }

ensureCapacityInternal方法只是用于扩容Char数组的长度 不做实际字符添加

 实际添加字符的功能在 str.getChars ()方法里调用的System.arraycopy实现

 String.getChars() 方法将字符从字符串复制到目标字符数组。

public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

进而点进去想看arraycopy是什么样的,发现这个方法用native修饰

 用native修饰的方法是调用的底层C语言写的函数。

本次源码阅读到此结束,下次有空再看看能不能找到这个方法的源码阅读学习一下

 

 

 

技 术 无 他, 唯 有 熟 尔。
知 其 然, 也 知 其 所 以 然。
踏 实 一 些, 不 要 着 急, 你 想 要 的 岁 月 都 会 给 你。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值