StringBuilder 与 StringBuffer

😈😈😈💪💪💪
首先我们先看下面这段简单的代码
通过下面这三行代码我们来猜一下一共创建了多少个对象?
如果我说一共创建了3个对象你信么😁(●’◡’●)

        String str1 = "hello";
        str1 += "word";
        System.out.println(str1);

输出结果为: helloword

如何证明这三行代码一共创建了3个对象呢?

通过查看汇编代码👇👇
在这里插入图片描述

查看汇编后翻译成java得到下面代码:👇👇👇

        String str1 = "hello";  //str1对象
        
        StringBuilder stringBuilder = new StringBuilder();  //stringBuilder对象
        stringBuilder.append(str1);
        stringBuilder.append("word");
        str1 = stringBuilder.toString();  //stringBuilder.toString返回的对象
        
        System.out.println(str1);

输出结果为: helloword

当我们在进行一个简单的字符串拼接的时候,以为只是创建了一个对象,其实则在背后 又创建了两个对象,一个是StringBuilder,另一个是toString的返回值

如果我们用for 循环进行字符串拼接时候,可想而知 频繁的创建对象所需要的时间并不是很可观
比如下面这段代码👇👇👇:
在这里插入图片描述
当循环拼接10000次字符串时,我这台电脑所需要的时间为366单位是毫秒,这个时间对于我们来说可能是挺快的了,但是对于电脑来说这个时间是非常慢的了

其实for循环这种拼接字符串的方式我们是不建议这样拼接的⚠️


StringBuilder

那如何高效率的完成字符串拼接呢?✌️✌️✌️
这时我们就会使用StringBuilder 或者 StringBuffer,那这两个类对于拼接字符串又有什么区别呢?
我们接着往下看:

先说StringBuilder吧
StringBuilder也是一个类,String 里没有的方法,StringBuilder有,StringBuilder没有的方法String有, 比如说StringBuilder中的reverse方法,String就没有,
那如何用StringBuilder拼接字符串呢?
以代码作为示例,比如下面这段代码

StringBuilder stringBuilder = new StringBuilder("hello");
stringBuilder.append("word").append(12);
stringBuilder.append(10.89);
System.out.println(stringBuilder.toString());

最后输出的结果为: helloword1210.89

在第一行代码中传入了 hello 值,并调用了StringBuilder的构造方法,查看构造方法的源码,我们可以发现返回都是this 说明是以this进行字符串拼接的,也就是当前对象

append是StringBuilder中的一个方法,作用是拼接字符串

虽然说 hello 这个值是存放在常量池当中的,但是在StringBuilder底层实现的时候,会把 hello 取出来一份作为StringBuilder的对象值,不论后面有什么操作,则都是在这个对象上进行操作的

最后我们也使用StringBuilder循环10000次看一看所需要的时间差
在这里插入图片描述
对比于普通的String字符串拼接 少了频繁的new对象操作,可以说比String效率要快了


StringBuffer

接着我们在来看一下 StringBuffer
也以同样的代码举例:👇👇👇

StringBuffer stringBuffer = new StringBuffer("hello");
stringBuffer.append("word").append(12);
stringBuffer.append(10.89);
System.out.println(stringBuffer.toString());

最后输出的结果为: helloword1210.89

以及同样循环10000次也是以StringBuilder大差不差的
在这里插入图片描述

那StringBuffer与StringBuilder的区别在哪呢>

我们以append方法举例说明:
在这里插入图片描述

👇👇👇
它们中的区别就是StringBuffer是synchronize修饰的
synchronize 可以理解为是一把锁,多线程情况下使用 但是频繁的加锁与释放锁都是需要耗费系统资源的

StringBuilder没有没被synchronize修饰,
在效率上因为StringBuilder没有synchronize修饰因此也没有加锁与释放锁,所以对于StringBuffer来说效率是快的
但是涉及到线程安全的问题StringBuffer比StringBuilder更安全

所以如果想要效率的话使用StringBuilder🛹🛹
想要线程安全的话使用StringBuffer🍵🍵

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值