字符串相关类:String、StringBuffer、StringBuilder
字符串相关的类:
* 1. String 字符串类,底层是基于常量char[], 一旦创建长度就固定不变了,适用于字符串不经常增删改的操作的场景。父接口:CharSequence
* 该接口的实现类:String、StringBuffer、StringBuilder
* String str = "abc";
* str += "d"; // 会创建新对象
*
* 2. 将其他类型转换为String类型的方式效率问题:
* toString() > String.valueOf(Object obj) > +
* 因为+号,底层先将字符串对象转换为StringBuilder对象,然后调用StringBuilder对象的append追加字符串方法,再调用toString方法
* 转换为String对象
*
* 3. 拼接字符串效率最高的方式:
* StringBuilder.append() > StringBuffer.append() > +
*
* 如果经常操作字符串用StringBuilder和StringBuffer,如果是单线程或者多线程且不要求线程安全问题,用StringBuilder,
* 如果是多线程且是线程安全要求用StringBuffer
* 4.常量池:提高效率
*
* 放字符串常量的地方,JDK8后是放在堆中
*
* 当创建字符串对象是字面量(直接是="")的时候,会优先从常量池中查找,是否有该字符串对象,如果有,则会直接将常量池中的地址赋值给该String对象,
* 如果没有,则会在常量池创建对象,然后将对象常量池的地址给String对象保存
*
* 当创建字符串对象用new创建,会优先从常量池中查找,是否有该字符串对象,如果有,则会直接将常量池中的地址赋值给该String对象在堆中的地址,
* 如果没有,则会在常量池创建对象,然后将对象常量池的地址给String对象在堆中保存
*
5. String、StringBuffer、StringBuilder使用场景
String 字符串类,底层是基于char[]常量,存在常量池中, 一旦创建长度就固定不变了,适用于字符串不经常增删改的操作的场景。
StringBuilder: 基于可变char[],存在堆中,默认长度是16个,适用于频繁操作(增删改插)字符串的场景,
该类是线程不安全的。字符串操作效率高
StringBuffer:基于可变的char[],存在堆中,默认长度是16个,适用于频繁操作(增删改插)字符串的场景,
该类是线程安全的。字符串操作效率低
如果是单线程和多线程没有线程安全要求,用StringBuilder,因为效率高。
如果是多线程有线程安全要求,用StringBuffer,因为线程安全
如果不经常操作字符串用 String节省空间【不经常替换、拼接、删除、插入用String】
StringBuffer和StringBuilder扩容机制:当要添加的字符串大于 > 当前字符数组的长度的时候
扩容,扩容是: 原来长度*2+2 的方式扩容