笔记:java.long包下的 String,StringBuffer和StringBuilder的区别

String

  1. final修饰的类,
  2. 是一个Immutable(不可变)的类,
    在声明多个相同字符串的时候,只会创建一个字符串对象,创建的时候
    首先会先去常量池查找,如果字符串存在就不会创建一个新的字符串
    在这里插入图片描述
    原理
    在执行String s = "a";的时候会创建个对象
    在执行s = "123456";的时候会创建个新的对象,并不是会覆盖原来的值
    实际上s是存放在引用地址中,引用的是char value[]数组,数组中存放变量123456

但是真的不可变么?其实我们可以通过反射来改变String中的value字段
例如:

String s = 'Hello Word';
//首先通过反射获取到String中的value字段
Field valueFieldOfString = String.class.getDeclaredField("value");
//改变value的访问权限
valueFieldOfString.setAccessible(true);
//获取到s对象上value属性的值
char[] value = (char[]) valueFieldOfString.get(s);
//改变value所引用的数组中的第5个字符(索引,角标)
value[5]='_'; //Hello_Word

这样Hello Word就变成了Hello_Word

StringBuffer与StringBuilder

  1. 长度可变,实际上是基于一个可变的char[]数组,默认大小16
    当创建StringBufferStringBuilder的时候,会去内存中创建一个存放值的空间,
    当执行xxx.append("")的操作的时候,会去开辟一个更大的空间
    把原来的内容复制到新的空间当中在加上新的内容,也就是append中的内容
    最后char[]数组会指向新开辟的地址
    所以无论执行多少次jvm都如上操作
    所以StringBufferStringBuilder长度是可变的,它们没有被final修饰
    在这里插入图片描述
  2. 它们都继承于AbstractStringBuilder
  3. StringBuffer是线程安全的,StringBuilder是线程不安全的

应用场景
String

  • 字符串内容不发生改变时常用
  • 例如,常量声明和少量的字符串拼接操作

StringBuffer

  • 适用于频繁的对字符串操作的时候,并且适用于多线程的环境下
  • 例如:xml解析等

StringBuilder

  • 适用于频繁的对字符串操作的时候,并且适用于单线程的环境下
  • 例如:sql语句拼接等

总结

  1. String`的长度是不可变的,但是值是可以改变的
  2. StringBufferStingBuilder的长度是可变的。
  3. 如果对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBufferStingBuilder
  4. 如果最后需要String,那么使用StringBuffertoString()方法,转化成String
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

95的猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值