一、String的基本特征
- 被声明为final类,内部变量亦被final修饰
- 典型的Immutable(不可变)类
- 字符串常亮缓存
hash可能需要被重新计算,所以没有被设置为final。
值一旦确立之后,在内存上就不会被改变了。删除添加的操作字符串操作都是新建了一个字符串,不是原来的字符串了。
被设置为Immutable类还有一个好处,字符串会存在字符串常量池,用到同一个字符串时不会创建新的字符串,可以直接引用到常量池里面的字符串,节省资源和开销。
二、String的引申说明
String对象是否真的不可变?
可以通过反射去改变String对象的值,不让他创建新的对象。
三、StringBuffer与StringBuilder
- 实现原理基于可修改的char数组,默认大小16
- 都继承自AbstractStringBuilder
- StringBuffer线程安全,StringBuilder非线程安全
容量不够会申请一个更大的内存空间,把字符串复制过去,新追加的字符串追加到后面,直到容量不够再次扩容。
新申请一块扩容一倍的内存块。
应用场景
String:在字符串内容不经常发生变化的业务场景优先使用String类
例如:常量声明、少量的字符串拼接操作等。
StringBuffer:在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在多线程环境下
例如:XML解析、HTTP参数解析与封装。
StringBuilder:在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在单线程环境下
例如:SQL语句拼装、JSON封装等。