【Java】JDK源码分析,先收藏了

AbstractStringBuilder.java中的相关代码:


    AbstractStringBuilder(int capacity) {

        value = new char[capacity];

	}



指定初始化容量,根据容量对数组进行初始化。

3. length方法


获取字符串长度。

AbstractStringBuilder.java中的相关代码:


    @Override

    public int length() {

        return count;

	}



4. capacity方法


获取容量,即最多可以保存的字符数量。

AbstractStringBuilder.java中的相关代码:


	public int capacity() {

    	// 返回数组长度

        return value.length;

	}



5. ensureCapacity方法


对数组的容量进行检测,并在容量小于要求时进行扩容。

AbstractStringBuilder.java中的相关代码:


	public void ensureCapacity(int minimumCapacity) {

    	// 若要求的容量大于0

        if (minimumCapacity > 0)

            // 则调用ensureCapacityInternal方法

            ensureCapacityInternal(minimumCapacity);

	}



1)ensureCapacityInternal方法

AbstractStringBuilder.java中的相关代码:


    private void ensureCapacityInternal(int minimumCapacity) {

        // 若要求的容量大于当前数组的长度,即需要扩容

        if (minimumCapacity - value.length > 0) {

            // 调用newCapacity方法,获取扩容后的容量

            // 将当前字符数组的内容复制到扩容后的新数组中,并返回新数组

            value = Arrays.copyOf(value,

                    newCapacity(minimumCapacity));

        }

	}



2)newCapacity方法

AbstractStringBuilder.java中的相关代码:


    private int newCapacity(int minCapacity) {

        // 计算新的容量为当前容量乘的2倍再加2

        int newCapacity = (value.length << 1) + 2;

        // 如果新计算的容量还是小于要求的容量

        if (newCapacity - minCapacity < 0) {

            // 设置新容量为要求的容量

            newCapacity = minCapacity;

        }

        // 如果新容量小于等于0或者新容量超过最大容量

        // 则返回调用hugeCapacity方法的结果,该方法用于获得一个相对较大的容量

        // 否则,返回新计算的容量

        return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)

            ? hugeCapacity(minCapacity)

            : newCapacity;

	}



3)hugeCapacity方法

AbstractStringBuilder.java中的相关代码:


	private int hugeCapacity(int minCapacity) {

    	// 若要求的容量大于整型数据的最大值,则抛出异常

        if (Integer.MAX_VALUE - minCapacity < 0) { 

            throw new OutOfMemoryError();

        }

        // 若要求的容量大于最大容量,则返回要求的容量,否则返回最大容量

        // 即返回两者中较大的一个

        return (minCapacity > MAX_ARRAY_SIZE)

            ? minCapacity : MAX_ARRAY_SIZE;

	}



6. trimToSize方法


该方法用于释放字符数组中没有用到空间。

AbstractStringBuilder.java中的相关代码:


	public void trimToSize() {

    	// 若已经使用的容量小于总容量

        if (count < value.length) {

            // 根据已经使用的容量,创建新的数组,将原数组的内容复制到新数组中

            // 保存新数组

            value = Arrays.copyOf(value, count);

        }

	}



7. setLength


该方法用于设置字符串的长度。

AbstractStringBuilder.java中的相关代码:


	public void setLength(int newLength) {

    	// 若设置的长度小于0,则抛出异常

        if (newLength < 0)

            throw new StringIndexOutOfBoundsException(newLength);

        // 进行扩容

        ensureCapacityInternal(newLength);



        // 如果已经使用的空间小于总空间

        if (count < newLength) {

            // 用’\0’对没有用到空间进行填充

            Arrays.fill(value, count, newLength, '\0');

        }

        // 设置已经使用使用的空间的数量

        count = newLength;

	}



8.charAt方法


获取字符串中指定位置的字符。

AbstractStringBuilder.java中的相关代码:


    @Override

	public char charAt(int index) {

    	// 若指定的位置小于0,或超过字符串的长度,则抛出异常

        if ((index < 0) || (index >= count))

            throw new StringIndexOutOfBoundsException(index);

        // 返回数组中对应位置的字符

        return value[index];

	}



9. getChars方法


将字符串中从srcBegin开始到srcEnd结束的字符填充到dst数组从dstBegin开始的位置。

AbstractStringBuilder.java中的相关代码:


    public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin){

    	// 若字符串起始位置小于0

        if (srcBegin < 0)

            throw new StringIndexOutOfBoundsException(srcBegin);

        // 若字符串终止位置小于0,或字符串终止位置超出了字符串的长度

        if ((srcEnd < 0) || (srcEnd > count))

            throw new StringIndexOutOfBoundsException(srcEnd);

        // 若字符串的起始位置超过了字符串的终止位置

        if (srcBegin > srcEnd)

            throw new StringIndexOutOfBoundsException("srcBegin > srcEnd");

        // 复制字符串的内容到数组中。

        System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);

	}



10. setCharAt方法


将字符串中指定位置index处的字符设置为指定字符ch。

AbstractStringBuilder.java中的相关代码:


	public void setCharAt(int index, char ch) {

    	// 若起始位置小于0,或超过字符串最大长度

        if ((index < 0) || (index >= count))

            throw new StringIndexOutOfBoundsException(index);

        // 设置字符数组index处字符为ch

        value[index] = ch;

	}



11. append方法


向字符串末尾附加一个字符串形式的对象。

1)参数为String

AbstractStringBuilder.java中的相关代码:


	public AbstractStringBuilder append(String str) {

    	// 若附加的字符串为空

        if (str == null)

            // 则调用appendNull方法,附加”null”,并返回

            return appendNull();

        // 若附加的字符串不为空

        // 获取附加的字符串的长度

        int len = str.length();

        // 进行扩容,新字符串长度为原长度count+附加长度len

        ensureCapacityInternal(count + len);

        // 调用附加字符串的getChars方法,从源字符串末尾count位置开始添加

        str.getChars(0, len, value, count);

        // 设置新字符串的长度

        count += len;

        // 返回

        return this;

	}



参数为StringBuffer和AbstractStringBuilder时的处理过程也是如此。

a)appendNull方法

AbstractStringBuilder.java中的相关代码:


	private AbstractStringBuilder appendNull() {

    	int c = count;

    	// 扩容

    	ensureCapacityInternal(c + 4);

    	// 拼接”null”

    	final char[] value = this.value;

    	value[c++] = 'n';

    	value[c++] = 'u';

    	value[c++] = 'l';

    	value[c++] = 'l';

    	// 设置新字符串的长度

    	count = c;

    	// 返回

    	return this;

	}



2)参数为Object

AbstractStringBuilder.java中的相关代码:


	public AbstractStringBuilder append(Object obj) {

    	// 调用Object对象的toString方法,拼接

        return append(String.valueOf(obj));

	}



3)参数为char[]

AbstractStringBuilder.java中的相关代码:


	public AbstractStringBuilder append(char[] str) {

    	// 获取附加的字符串的长度

        int len = str.length;

        // 扩容

        ensureCapacityInternal(count + len);

        // 将str中长度为len的内容从起始位置0复制到value数组count后

        System.arraycopy(str, 0, value, count, len);

        // 设置新字符串的长度

        count += len;

        // 返回

        return this;

	}



4)参数为boolean

AbstractStringBuilder.java中的相关代码:


	public AbstractStringBuilder append(boolean b) {

    	// 为true

        if (b) {

            // 容量加4

            ensureCapacityInternal(count + 4);

            // 拼接”true”

            value[count++] = 't';

            value[count++] = 'r';

            value[count++] = 'u';

            value[count++] = 'e';

        } else {// 为false

            // 容量加5

            ensureCapacityInternal(count + 5);

            // 拼接”fasle”

            value[count++] = 'f';

            value[count++] = 'a';

            value[count++] = 'l';

            value[count++] = 's';

            value[count++] = 'e';

        }

        // 返回

        return this;

	}



5)参数为char

AbstractStringBuilder.java中的相关代码:


    @Override

	public AbstractStringBuilder append(char c) {

    	// 容量加1

        ensureCapacityInternal(count + 1);

        // 拼接字符

        value[count++] = c;

        // 返回

        return this;

	}



6)参数为int

AbstractStringBuilder.java中的相关代码:


	public AbstractStringBuilder append(int i) {

    	// 若为整型的最小值,即-2147483648

        if (i == Integer.MIN_VALUE) {

            // 直接拼接

            append("-2147483648");

            // 返回

            return this;

        }

        // 通过调用Integer的静态方法stringSize,获取i的长度

        int appendedLength = (i < 0) ? Integer.stringSize(-i) + 1

                                     : Integer.stringSize(i);

        // 计算拼接后的长度

        int spaceNeeded = count + appendedLength;

        // 扩容

        ensureCapacityInternal(spaceNeeded);

        // 调用Integer的getChars方法进行拼接

        Integer.getChars(i, spaceNeeded, value);

        // 设置新字符串长度

        count = spaceNeeded;

        返回

        return this;

	}



参数为long时,处理过程和int相似,只不过在拼接字符串时调用的是Long的静态方法getChars。

7)参数为float

AbstractStringBuilder.java中的相关代码:


	public AbstractStringBuilder append(float f) {

    	// 调用FloatingDecimal的静态方法appendTo方法进行拼接

        FloatingDecimal.appendTo(f,this);

        // 返回

        return this;

	}



参数double与float处理过程完全相同。

12. delete方法


删除字符串中指定开始位置和终止位置之间的字符。

AbstractStringBuilder.java中的相关代码:


	public AbstractStringBuilder delete(int start, int end) {

    	// 若起始位置小于0

        if (start < 0)

            throw new StringIndexOutOfBoundsException(start);

        // 若终止位置超过字符串长度

        if (end > count)

            // 设置终止位置为字符串末尾

            end = count;

        // 若起始位置大于终止位置

        if (start > end)

            throw new StringIndexOutOfBoundsException();

        // 计算需要删除字符串的长度

        int len = end - start;

        // 若需要删除字符串的长度大于0

        if (len > 0) {

            // 将终止位置后面的字符串复制到起始位置后面

            System.arraycopy(value, start+len, value, start, count-end);

            // 设置删除后的字符串的长度

            count -= len;

        }

        // 返回

        return this;

	}



13. deleteCharAt方法


删除字符串中指定位置的字符。

AbstractStringBuilder.java中的相关代码:


	public AbstractStringBuilder deleteCharAt(int index) {

    	// 若指定位置小于0,或超过字符串长度

        if ((index < 0) || (index >= count))

            throw new StringIndexOutOfBoundsException(index);

        // 将index后面的字符串复制到index处

        System.arraycopy(value, index+1, value, index, count-index-1);

        // 新字符串长度为源字符串长度减1

        count--;

        // 返回

        return this;

	}



14.replace方法


将起始位置start和终止位置end之间的字符串替换为字符串str。

AbstractStringBuilder.java中的相关代码:


	public AbstractStringBuilder replace(int start, int end, String str) {

    	// 若起始位置小于0

        if (start < 0)

            throw new StringIndexOutOfBoundsException(start);

        // 若起始位置超出了字符串的长度

        if (start > count)

            throw new StringIndexOutOfBoundsException("start > length()");

        // 若起始位置大于终止位置

        if (start > end)

            throw new StringIndexOutOfBoundsException("start > end");

        // 若终止位置超出字符串长度

        if (end > count)

            // 设置终止位置为字符串的末尾

            end = count;

        // 获取需要替换进来的字符串的长度


**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/aae73ec63f78ff4606aa04913963e7fd.png)
![img](https://img-blog.csdnimg.cn/img_convert/427c07bb47a6cdddc4458d0f1350deaa.png)
![img](https://img-blog.csdnimg.cn/img_convert/29137a150ccbd1265ffca4f055ca4dd5.png)
![img](https://img-blog.csdnimg.cn/img_convert/96161958484f277cc485d1be0aeb44d4.png)
![img](https://img-blog.csdnimg.cn/img_convert/c2454e0a63018cb85952bfbc36e46f23.png)
![img](https://img-blog.csdnimg.cn/img_convert/85dbfbd874aa7793f1cc0ae6141cc885.png)
![img](https://img-blog.csdnimg.cn/13f2cb2e05a14868a3f0fd6ac81d625c.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)**
![img](https://img-blog.csdnimg.cn/img_convert/24606b0ee2083e611b38c1575893e70a.png)



### 尾声

如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

这里,笔者分享一份从架构哲学的层面来剖析的视频及资料给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

![](https://img-blog.csdnimg.cn/img_convert/971daefdd5ab4c68631e18c705a31d63.webp?x-oss-process=image/format,png)

##### Android进阶学习资料库

一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!

![](https://img-blog.csdnimg.cn/img_convert/9b82fc3007c3d2afce57d4220073ce39.webp?x-oss-process=image/format,png)

##### 大厂面试真题

PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

![](https://img-blog.csdnimg.cn/img_convert/b768e2d1b6f2aabb8aa594dcd0ef5621.webp?x-oss-process=image/format,png)

**《2019-2021字节跳动Android面试历年真题解析》**

![](https://img-blog.csdnimg.cn/img_convert/06b2607d327b4107b4de538dd5931be3.webp?x-oss-process=image/format,png)

##### 

入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)**
[外链图片转存中...(img-P5GIodOo-1711968808359)]



### 尾声

如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

这里,笔者分享一份从架构哲学的层面来剖析的视频及资料给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

[外链图片转存中...(img-igMl44OZ-1711968808359)]

##### Android进阶学习资料库

一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!

[外链图片转存中...(img-89v6fDML-1711968808359)]

##### 大厂面试真题

PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中...(img-PQIDxzRr-1711968808360)]

**《2019-2021字节跳动Android面试历年真题解析》**

[外链图片转存中...(img-offakscD-1711968808361)]

##### 

> **本文已被[CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》]( )收录**
  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值