今天看啥  ›  专栏  ›  萌新小灰灰

String,StringBuffer,StringBuilder之间的关系

萌新小灰灰  · CSDN  ·  · 2021-01-19 12:15

今天我们说说 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
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

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

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

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




原文地址:访问原文地址
快照地址: 访问文章快照