Java基础回顾:String,StringBuilder,StringBuffer
个人笔记,网上资料以及通过源码总结,侵删
1. String
- jdk1.8 使用char[]
- jdk11 使用byte[]
类图
![](https://img2020.cnblogs.com/blog/1461236/202110/1461236-20211013173024767-1439104914.png)
特性
String的值是不可变的,每次操作String都会生成新的String对象
类似 str += "WORLD!",会改变str指向堆内存的地址
![](https://img2020.cnblogs.com/blog/1461236/202110/1461236-20211013173040693-1524611372.png)
初始String值为“hello”,然后在这个字符串后面加上新的字符串“world”,这个过程是需要重新在栈堆内存中开辟内存空间的,最终得到了“hello world”字符串也相应的需要开辟内存空间,这样短短的两个字符串,却需要开辟三次内存空间,不得不说这是对内存空间的极大浪费。为了应对经常性的字符串相关的操作,就需要使用Java提供的其他两个操作字符串的类——StringBuffer类和StringBuild类来对此种变化字符串进行处理。
线程安全
2. StringBuilder
![](https://img2020.cnblogs.com/blog/1461236/202110/1461236-20211013173104042-763036476.png)
主要参数
初始化默认16个字符长度,可以自定义,如果初始化有值的话,分配大小为 值长度+16.
线程不安全
3. StringBuffer
![](https://img2020.cnblogs.com/blog/1461236/202110/1461236-20211013173125472-1932201322.png)
主要参数
同StringBuilder:初始化默认16个字符长度,可以自定义,如果初始化有值的话,分配大小为 值长度+16.
线程安全
通过synchronized关键字实现线程安全
@Override public synchronized StringBuffer append(Object obj) { toStringCache = null; super.append(String.valueOf(obj)); return this; }
4. 比较
基本原则:如果要操作少量的数据,用String ;
单线程操作大量数据,用StringBuilder ;
多线程操作大量数据,用StringBuffer。
一点浩然气,千里快哉风!