为什么StringBuilder拼接字符串比String要高效

要想搞明白为什么StringBuilder 比 String 高效,那首先要先知道java内存分配。
java内存分配嘛…网上一搜一大堆,当然你如果不想搜的话
点击这里
好,我们主要用到 java的栈和堆这两块内存区
了解了Java内存分配了以后,我们知道,基本数据类型都是存放在栈中。
所以我们比较两个基本数据类型的时候,可以用“= =“ 符号来操作;
比如
int a = 2;
int b= 2:
a == b 返回为true,因为他们本身就是字面值。
但是String 不一样。
虽然我们的写法 String c = “c”;
哎呦,看上去和基本数据类型的那八个货好像没啥区别。
那我们换一种写法
String c = new String(“c”);
你可以做到 int a = new int(2) 吗???
别试了兄嘚,你做不到
因为String 本身就不是基本数据类型,是引用数据类型
我们平时所写的
String c = “c”; 与 String c = new String(“c”);是同一种写法,我们都是创建了一个新的对象。只不过前者将 new 对象的步骤隐含了而已。
所以我们在操作 String 比较是否相等时,并不是用 “= =”;
因为当我们比较两个字符串是否一致的时候:
String d = “搞事情”; //栈中创建 一个引用 d 指向了堆中分配的一块内容 “搞事情” ,此时 d 存的是 “搞事情” 在堆中的地址
String e = “搞事情”; //栈中创建 一个引用 e 指向了堆中分配的一块内容 “搞事情” ,此时 e 存的是 “搞事情” 在堆中的地址
d==e 返回肯定是 false.因为这时候其实 d 和 e 存储的只是一个地址而已,我们每次都是 new 出来的String ,d 和 e 存的地址当然不一样,这个时候我们应该用 “equals” 方法去比较他们在堆中的内容。

好,说了这么多,我大致是想阐述 String 的一些特殊性;

StringBuilder 也是引用类型,当我们使用 StringBuilder 的时候也需要new出一个新的对象
那我们来看:

StringBuilder a = new StringBuilder(“a”);
a.append(“b”);
a.append(“c”);

和:

String a = “a”;
a += “b”;
a += “c”;

这两种方式,看起来好像区别不大,实际用起来的时候,区别好像也不大。
那么大家都是对象。 StringBuilder你凭什么比人家高效(因为你比较长?);
好,我们点一下 String 的源码:
在这里插入图片描述
当当当当!!!!!!
final !!!
看到没有,String 居然是final 修饰的,他的构造方法同时也指向了一些final变量。
那么我们知道 final 是不可变啊
原来是这样,你个老String坏的很。
我们再来看:
在这里插入图片描述

当 str 使用final修饰的时候 ,为其重新赋值,便会报错,但是继续改变它的值,就可以通过编译
所以可以看出,final修饰的变量,其引用不能变,但是引用所对应的内容是可以改变的

那我们
String a = “a”;
a += “b”;
a += “c”;
这段代码中的每一步,都是在创建新的对象,只是 a 不停地换指向的地址而已;

而 StringBuilder 只是在堆中维护自己的一块区域,当追加值的时候也只是在这块区域中追加(长度不足时自动扩容);
所以这么看,StringBuilder 只是使用一块内存,而 String 每次的追加都会增加新的对象,新的内存,白白多了一些创建销毁的过程,所以 StringBuilder 肯定比 String 要高效

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值