Java 中字符串底层原理的一些学习记录

167 阅读2分钟

字符串的一些学习记录

字符串存储的内存原理

  • 直接赋值会复用字符串常量池(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 机制,则以实际长度为准