String,StringBuffer,StringBuilder之间的关系
今天我们说说 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:单线程
本文地址:https://blog.csdn.net/python_777/article/details/112795116
推荐阅读
-
浅析C#中StringBuilder类的高效及与String的对比
-
C#中List〈string〉和string[]数组之间的相互转换
-
ThinkPHP中URL路径访问与模块控制器之间的关系
-
面向对象类空间问题以及类之间的关系
-
对Python Class之间函数的调用关系详解
-
String、StringBuffer和StringBuilder类的区别
-
通过实例解析spring bean之间的关系
-
java中String和StringBuffer的区别
-
全面解释java中StringBuilder、StringBuffer、String类之间的关系
-
详谈C# 图片与byte[]之间以及byte[]与string之间的转换