【Java】JDK源码分析——AbstractStringBuilde

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;

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

        int len = str.length();

        // 计算替换后的长度:原来的长度+替换进来的长度-替换后被覆盖的长度

        int newCount = count + len - (end - start);

        // 扩容

        ensureCapacityInternal(newCount);

        

        // 从替换后被覆盖的位置开始将后面的字符复制到

        // 加入替换进来的字符串后的末尾

        // 把需要替换进来的字符串需要的空间留出来

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

        // 添加需要替换进来的字符

        str.getChars(value, start);

        // 设置新的字符串的长度

        count = newCount;

        // 返回

        return this;

    }



15. substring方法


截取指定起始位置和终止位置的字符串。

AbstractStringBuilder.java中的相关代码:


	public String substring(int start, int end) {

    	// 若起始位置小于0

        if (start < 0)

            throw new StringIndexOutOfBoundsException(start);

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

        if (end > count)

            throw new StringIndexOutOfBoundsException(end);

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

        if (start > end)

            throw new StringIndexOutOfBoundsException(end - start);

        // 返回一个新的字符串

        return new String(value, start, end - start);

	}



16.insert方法


从指定位置开始向原字符串中插入一个字符串。

AbstractStringBuilder.java中的相关代码:


	public AbstractStringBuilder insert(int offset, String str) {

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

        if ((offset < 0) || (offset > length()))

            throw new StringIndexOutOfBoundsException(offset);

        // 若插入的字符串为空

        if (str == null)

            // 对其赋值为”null”

            str = "null";

        // 获取需要插入的字符串的长度

        int len = str.length();

        // 扩容

        ensureCapacityInternal(count + len);

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

        // 为插入的字符串留好空间

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

        // 插入字符串

        str.getChars(value, offset);

        // 设置新字符串长度

        count += len;

        // 返回

        return this;

	}



17.indexOf方法


查找字符串中是否包含指定的字符串,若包括,则返回字符串的起始位置,否则返回-1。

AbstractStringBuilder.java中的相关代码:


    public int indexOf(String str) {

        return indexOf(str, 0);

	}



调用了重载方法。

AbstractStringBuilder.java中的相关代码:


    public int indexOf(String str, int fromIndex) {

        return String.indexOf(value, 0, count, str, fromIndex);

	}



调用了String中的静态方法indexOf,该方法用于指定位置查找在一个字符数组是否包含另一个字符数组。且这两个数组都可以选择起始位置和长度。(终止位置=起始位置+长度)

String.java中的相关代码:


    static int indexOf(char[] source, int sourceOffset, int sourceCount,

            char[] target, int targetOffset, int targetCount,

            int fromIndex) {

        // 若查找的起始位置大于等于被查找的字符串长度

        if (fromIndex >= sourceCount) {

            // 若查找的字符串的长度为0,说明查找的字符串为””,

			// 则返回被查找字符串的长度,否则返回-1

            return (targetCount == 0 ? sourceCount : -1);

        }

        // 若查找的起始位置小于0

        if (fromIndex < 0) {

            // 设置查找的起始位置为0

            fromIndex = 0;

        }

        // 若查找的字符串长度为0,说明查找的字符串为””

        if (targetCount == 0) {

            // 返回查找的起始位置

            return fromIndex;

        }



        // 获取需要查找的第一个字符

        char first = target[targetOffset];

        // 计算循环在被查找字符串停止的位置

        // sourceCount – targetCount表示起始位置为0时,查找字符串需要停止的位置

        // 因为继续查找,被查找字符串剩下的长度小于需要查找的字符串长度

        // 由于被查找的字符串起始位置不为0,所以要加上sourceOffset

        int max = sourceOffset + (sourceCount - targetCount);



        // 循环

		// 起始位置为被查找字符的起始位置加上查找的起始位置(偏移)

        for (int i = sourceOffset + fromIndex; i <= max; i++) {

            // 若被查找字符串和需要查找的字符串的第一个字符不相同

            if (source[i] != first) {

                // 循环,找到第一个相同的字符,

				// 同时首位相同的字符位置i不能超过最大位置max

                while (++i <= max && source[i] != first);

            }



            // 若首位相同的字符位置i不能超过最大位置max

            // 则继续找剩余的字符

            if (i <= max) {

                // 计算之后需要查找的字符的起始位置

                int j = i + 1;

                // 计算最后一个需要查找的字符的位置

                // j-1+tartgetCount = i + targetCount

                int end = j + targetCount - 1;

                // 循环,查找剩余字符是否相等,不相等就结束循环

                for (int k = targetOffset + 1; j < end && source[j]

                        == target[k]; j++, k++);



                // 判断上面的循环是否循环到了最后

                // 循环到最后说明剩下所有的字符都已经找到,即j == end

                // 若找到

                if (j == end) {

                    // 返回需要查找的字符串的首字符在

					// 被查找字符串中出现的起始位置

                    return i - sourceOffset;

                }

            }

        }

        // 若没有找到,返回-1

        return -1;

    }



18. reverse方法


对字符串进行反转。

AbstractStringBuilder.java中的相关代码:


	public AbstractStringBuilder reverse() {

    	// 表示字符串中的字符是否是UTF-16中用于构成Unicode字符的保留字符

    	// 即是否是两个字符为一个Unicode字符

        boolean hasSurrogates = false;

        // n为字符数组最后一个字符的位置

        int n = count - 1;

        // 循环 从中间开始,两个指针j和k,依次向两边走,交换字符

        // 长度为偶数时,从最中间两个字符开始

        // 长度为奇数时,最中间的字符会被跳过,会从中间字符的两边开始

        // (n-1)除以2后的到的值为我们要的中间的值

        for (int j = (n-1) >> 1; j >= 0; j--) {

            // 计算对称字符的位置

            int k = n - j;

            // 交换字符

            char cj = value[j];

            char ck = value[k];

            value[j] = ck;

            value[k] = cj;

            // 判断字符是否为UTF-16中用于构成Unicode字符的保留字符

            if (Character.isSurrogate(cj) ||

                Character.isSurrogate(ck)) {

                // 若是,则设置标志位为true

                hasSurrogates = true;

            }

        }

        // 如果是保留字符

        if (hasSurrogates) {

            // 以两个字符为一个单位,调换位置

            // 因为高低代理对的顺序不能变 

            reverseAllValidSurrogatePairs();

        }

        // 返回

        return this;

	}



1)reverseAllValidSurrogatePairs方法

AbstractStringBuilder.java中的相关代码:


	private void reverseAllValidSurrogatePairs() {

    	// 循环

        for (int i = 0; i < count - 1; i++) {

            // 获取一代理对中的第一个

            char c2 = value[i];

            // 如果是低代理



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

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

**因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/621c84d928de3bae8256b5e3a9ad208a.png)
![img](https://img-blog.csdnimg.cn/img_convert/149a47ca8d337d6669cb0d73fdabbf67.png)
![img](https://img-blog.csdnimg.cn/img_convert/c57d7a144817c04971d612ddd001d849.png)
![img](https://img-blog.csdnimg.cn/img_convert/543018dc98fa77c68b92a4de119ee70f.png)
![img](https://img-blog.csdnimg.cn/img_convert/5e00fab7e7e3e50d0f9f604149028321.png)
![img](https://img-blog.csdnimg.cn/img_convert/1ee9dfb015017e48370969efad9d9443.png)
![img](https://img-blog.csdnimg.cn/13f2cb2e05a14868a3f0fd6ac81d625c.png)

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

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

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



## 总结

学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

**最后如何才能让我们在面试中对答如流呢?**

答案当然是平时在工作或者学习中多提升自身实力的啦,那如何才能正确的学习,有方向的学习呢?有没有免费资料可以借鉴?为此我整理了一份Android学习资料路线:

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

这里是一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套**BAT大厂面试资料专题包**,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家。

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

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者**刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划**。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

最后,祝愿即将跳槽和已经开始求职的大家都能找到一份好的工作!

> 这些只是整理出来的部分面试题,后续会持续更新,希望通过这些高级面试题能够降低面试Android岗位的门槛,让更多的Android工程师理解Android系统,掌握Android系统。喜欢的话麻烦点击一个喜欢再关注一下~

> **本文已被[CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》]( )收录**

[**一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!**](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)

**AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**

今天的分享就到这里,如果你对在面试中遇到的问题,或者**刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划**。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

最后,祝愿即将跳槽和已经开始求职的大家都能找到一份好的工作!

> 这些只是整理出来的部分面试题,后续会持续更新,希望通过这些高级面试题能够降低面试Android岗位的门槛,让更多的Android工程师理解Android系统,掌握Android系统。喜欢的话麻烦点击一个喜欢再关注一下~

> **本文已被[CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》]( )收录**

[**一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!**](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)

**AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值