字符串的一些学习记录
字符串存储的内存原理
- 直接赋值会复用字符串常量池(StingTable)中的值
- new 出来的不会复用,而是开辟一个新的空间
== 号比较的是什么
- 基本数据类型比较数据值
- 引用数据类型比较地址值
字符串拼接的底层原理
- 拼接时没有变量,都是字符串,则触发字符串的优化机制,在编译的时候就已经是最终的结果了
- 拼接时有变量参与,在内存中创建了很多对象(JKD8之前更加复杂),浪费空间,时间也非常慢
- JDK8之前每次拼接中,都会自动创建一个StringBuilder对象,再调用append()进行拼接,再用toString()转化为String类型,而toString()相当于有 new 了一个新的字符串对象
//如
String a1 = "a";
String a2 = a1 + "b";
//new StringBuilder().append(a1).append("b").toString()
String a3 = a2 + "c";
//new StringBuilder().append(a2).append("c").toString()
- JDK8之后,系统会预估字符串拼接后的大小,创建一个数组存放,再将其变成字符串,但是如果有多个字符串与变量进行拼接,同样会进行多次预估,创建多个对象,所以字符串与变量拼接时不建议使用 +
总结
如果很多有字符串与变量进行拼接,不建议直接 + ;因为在底层会创建多个对象,浪费时间,浪费性能
StringBuilder 提高效率原理
所有要拼接的内容都会往 StringBuilder 中放,不会创建很多无用的空间,节约内存
StringBuilder
capacity() 查询容量大小
- 创建一个长度为 16 的字节数组
- StringBuilder 扩容时,会创建一个新的数组,将 老容量*2 + 2 赋值给新数组
- 如果超出默认扩容 老容量*2 + 2 机制,则以实际长度为准