String--StringBuffer--StringBuilder之间的爱恨情仇(初级开发常分不清)

首先熟悉一下三个类:
String: 适用于字符串少量修改
StringBuffer: 多线程频繁修改字符串
StringBuilder:单线程频繁修改字符串

String,StringBuffer,StringBuilder的异同

共同点:
1 都属于java.lang包
2 可以互相转换,大都用于字符串的修改

不同点:
1.String: 源码中以长度为"传入字符串长度"的char类型数组进行保存,jdk1.9 起以byte类型数组保存参数(传入英文时byte类型比char类型要节省1字节的空间) //看源码

StringBuilder,StringBuffer: 源码长度为"传入字符串长度"+16 固定长度的char类型数组进行保存。//看源码


2.String类是不可变的 (传入的字符串用带有final关键字修饰char类型数组保存,无法被修改) //看源码

StringBuilder,StringBuffer:具有可变性,传入的字符串无final关键字修饰,可修改。(源码用System.arraycopy()方法对char数组
长度不足的情况下可以进行扩容) //看源码


3 当频繁处理字符串时,StringBuffer,StringBuilder比String更能
提高性能,节约空间

注:上述的异同点要是不懂的可以瞅一下源码哟~~


StringBuffer和StringBuilder的不同点

1.线程安全:
StringBuffer类 (jdk1.0版本):适用于多线程,方法利用synchronized同步锁牺牲性能换安全

StringBuilder类(jdk1.5版本):适用于单线程,没有给方法施加synchronized同步锁,牺牲了安全换性能

2.性能:
StringBuffer:线程安全,性能较差,开销大

StringBuilder:线程不安全,性能较好,开销小

相同条件下,使用StringBuilder,比使用StringBuffer能获得10%~15%左右的性能提升

补充一点:
String类型若是在字符常量池进行拼接操作,切记不能利用变量拼接,由于变量的创建在堆中开辟,导致比较的内存地址会出错

String str1="AABB";
String str2="AA";
String result="AA"+"BB";
String result1=str2+"BB";  //str2为变量
System.out.println(result==result1);

结果为:
在这里插入图片描述

总结:
1.String类型具有不可变,StringBuffer和StringBuilder 有可变性
2.String处理少量字符串,StringBuffer和StringBuilder 频繁处理字符串

3.StringBuffer:牺牲性能换安全;StringBuilder:牺牲安全换性能
4.StringBuffer:多线程 ;StringBuilder:单线程

猜你喜欢

转载自blog.csdn.net/tzydzj/article/details/113559883