😈😈😈💪💪💪
首先我们先看下面这段简单的代码
通过下面这三行代码我们来猜一下一共创建了多少个对象?
如果我说一共创建了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🍵🍵