字符串的原理
目录
1.字符串储存的内存原理
2.== 号比较的到底是什么?
3.字符串拼接的底层原理
4.StringBulider提高效率原理图
5.StringBuilder 源码分析
1.字符串储存的内存原理
直接赋值会复用字符串常池中的
new出来不会复用,而是开辟一个新的空间
2.== 号比较的到底是什么?
基本戴数据类型比较数据值
引用数据类型比较地址值
3.字符串拼接的底层原理
第一类:没有变量参与
字符串直接相加,编译之后就是拼接之后的结果了,会复用串池中的字符串
第二类:有变量参与
会创建新的字符串,浪费内存
结论:如果很多字符串变量拼接,不要直接+。在底层会创建多个对象,浪费时间,浪费性能
4.StringBulider提高效率原理图
所有要拼接的内容都会往StringBuilder中放,不会创建很多无用的空间,节约内存
字符串拼接的时候,如果有变量:
JDK8以前:系统底层会创建一个StringBuilder对象,然后再调用其append方法完成拼接,
拼接后,再调用tostring 方法转换为String类型,而toString方法 的底层直接new 了一个字符串对象
JDK8版本:系统会预估要字符串拼接之后的大小,把拼接的内容都放在数组中,此时也是产生一个新的字符串
5.StringBuilder 源码分析
默认创建一个长度为16的字节数组
添加的长度小于16,直接存
添加的内容大于16会扩容(原来的容量* 2 +2)
如果扩容长度还不够,以实际长度为准
public class w{
public static void main(String[] args) {
//容量:最多装多少
//长度:已经装了多少
StringBuilder sb = new StringBuilder();
System.out.println(sb.capacity());
System.out.println(sb.length());
sb.append("abc");
System.out.println(sb.capacity());
System.out.println(sb.length());
}
}
运行结果
16
0
16
3