一、 String
String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率较低
1、String 有属性 private final char value[]; 用于存放字符串内容
2、value 是一个 final 类型: value 【本质是char数组】不能指向新的地址,但是单个字符内容是可以变化
1、创建 String 对象的两种方式
1)方式一:直接赋值String s="hello";
2)方式二:调用构造器 String s=new String("hello");
2、两种创建 String 对象的区别
1、方式一:先从常量池查看是否有"hello"数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址
2、方式二:先在堆中创建空间,里面维护了value属性,指向常量池的hello空间。如果常量池没有"hello",重新创建;如果有,直接通过valu指向。s最终指向的是堆中的空间地址。
二、StringBuffer
StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上可以更新内容,不用每次更新地址,效率较高
1、 StringBuffer 的直接父类 是 AbstractStringBuilder
2、在父类中 AbstractStringBuilder 有属性 char[] value,不是 final该 value 数组存放字符串内容,存放在堆中的
3、因为 StringBuffer 字符内容是存在 char[] value, 所有在变化(增加/删除)不用每次都更换地址(即不是每次创建新对象), 所以效率高于 String
三、StringBilder
1、一个可变的字符序列。此类提供一个与StringBuffer 兼容的API,但不保证同步(StringBuilder线程不安全)。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer 要快。
2、在 StringBuilder上的主要操作是 append 和insert 方法,可重载这些方法,以接受任意类型的数据。
四、String、StringBuffer 、 StringBuilder 的比较
1、类图
2、比较
字符序列 | 效率 | 线程安全性 | |
String | 不可变 | 效率低 | 线程安全 |
StringBuffer | 可变 | 效率较高(增删) | 线程安全 |
StringBuilder | 可变 | 效率最高 | 线程不安全 |
五、 String、StringBuffer 和 StringBuilder 的选择
1、如果字符串存在大量的修改操作,一般使用 StringBuffer 或 StringBuilder
2、如果字符串存在大量的修改操作,并在单线程的情况,使用StringBuilder
3、如果字符串存在大量的修改操作,并在多线程的情况,使用StringBuffer
4、如果我们字符串很少修改,被多个对象引用,使用String,比如配置信息等
备注:
以上若有明显错误的地方,可以私信我哦,谢谢~