天天看点

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

String

  1. final

    修饰的类,
  2. 是一个

    Immutable

    (不可变)的类,

    在声明多个相同字符串的时候,只会创建一个字符串对象,创建的时候

    首先会先去常量池查找,如果字符串存在就不会创建一个新的字符串

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

    原理:

    在执行

    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

    当创建

    StringBuffer

    StringBuilder

    的时候,会去内存中创建一个存放值的空间,

    当执行

    xxx.append("")

    的操作的时候,会去开辟一个更大的空间

    把原来的内容复制到新的空间当中在加上新的内容,也就是append中的内容

    最后

    char[]

    数组会指向新开辟的地址

    所以无论执行多少次jvm都如上操作

    所以

    StringBuffer

    StringBuilder

    长度是可变的,它们没有被

    final

    修饰
    笔记:java.long包下的 String,StringBuffer和StringBuilder的区别
  2. 它们都继承于

    AbstractStringBuilder

  3. StringBuffer

    是线程安全的,

    StringBuilder

    是线程不安全的

应用场景:

String

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

StringBuffer

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

StringBuilder

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

总结:

  1. String`的长度是不可变的,但是值是可以改变的
  2. StringBuffer

    StingBuilder

    的长度是可变的。
  3. 如果对字符串中的内容经常进行操作,特别是内容要修改时,那么使用

    StringBuffer

    StingBuilder

  4. 如果最后需要

    String

    ,那么使用

    StringBuffer

    toString()

    方法,转化成

    String