String 、StringBuffer、StringBuilder 三者的异同(重点面试题)(1)

String:

StringBuffer:

StringBuilders:

我们可以通过上面的三个底层源码可以看到三者都是用char[ ]来存储,为什么就 String 是不可变的呢? 我相信细心的小伙伴已经发现了 ,就 String 有 final ,则String是不可以变的。(如果有小伙伴对 final 不是很了解,我过几天会总结一下final的知识点。)

上面虽然简述了为什么可变不可变的原理,但是面试题可没上面几句简单,所以下面就是正真的重点!!!仔细看!!!

我们先进行源码的分析:

String str = new String(); //char[0]

String str1 = new String(“abc”);//char[] value = new char[]{‘a’,‘b’,‘c’};

我们能知道这个是String的创建方法。

StringBuffer stringBuffer = new StringBuffer();

接下来我们查看一下StringBuffer的底层源码:

再查看super:

在查看value:

从源码我们能知道 StringBuffer 在创建一个新空间时,是首先构造一个字符串生成器,其中不包含字符,初始容量为16个字符。

StringBuffer stringBuffer = new StringBuffer();

//相当于底层创建了一个长度为16 char[] 数组

stringBuffer.append(‘a’); //value[0] = ‘a’;

stringBuffer.append(‘b’); //value[1] = ‘b’;

stringBuffer.append(‘c’); // value[2] = ‘c’;

当我们使用:

StringBuffer stringBuffer = new StringBuffer(“abc”);

我们查看底层源码:

我们能知道他是会创建一个 str.length() + 16 的数组长度。

StringBuffer stringBuffer = new StringBuffer(“abc”);

//char [] value = new char [“abc”.length() + 16]

通过上述对源码的查询我们能知道StringBuffer之所以可变是因为他有大量的数组空间,我们可以通过在数组上修改通过对字符串的修改!!!

这样我们就正真的知道了为啥 StringBuffer 是可以变的了(StringBuilders和StringBuffer 的结构是相同的,上述结论也符合StringBuilders)


拓展一:

我们接下来要对StringBuffer的可变进行一些问题的延申:

我们通过上述源码分析我们能知道因为StringBuffer对char[] 数组的增大才可以使字符串变成可变性,一般情况StringBuffer初始话就比字符串长度多16个,如果我们一直对字符串进行添加处理直到超过初始化定义的长度会怎么办呢???

是会溢出还是会有一些解决办法呢???

我们可以在对源码进行分析:

这段源码的作用就是对添加后的字符串长度是否超过底层数组的长度进行一个判断,如果超过原来的底层数组就会执行newCapacity这个函数。接下来我们再来查看这个函数的源码:

通过对这个源码的分析我们能知道:这个是创建一个原来长度两倍加+2的长度的数组。

再来一起分析上面的几个代码我们可以知道如果原来的数组容量不够的情况下,我们会创建一个为原来长度两倍加2的一个新数组,再把原来的数组内容复制到现在这个数组中,并且在进行判断添加后的数组是否能大于添加后的长度,如果还是达不到则继续创建新的更大的数组,直到能大于目前添加后字符串的长度为止。


拓展二:

String、StringBuffer 和 StringBuilders三者的效率比较。

我们可以通过下面执行的代码来判断一下三者的执行效率:

package StringMoth;

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

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

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

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

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

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

g_convert/9f49b566129f47b8a67243c1008edf79.png)

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

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

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值