String知识点 - Java基础

97 阅读2分钟

字符串相加的原理

字符串相加,实际转换为StringBuilder对象将字符串append,不建议再循环中使用

String a = "abc";
String b = "bcd";

a + b => (new StringBuilder()).append("abc").append("bcd")

字符串不可变性的好处

  • 缓存,jvm开辟了空间专门存储字符串,叫字符串池,两个字符串内容相同的变量可以同时指向字符串池中的一个字符串对象,从而节省内存
  • 安全性,由于字符串的不可变性,程序在使用或者传递字符串时,字符串是可信的,如果字符串内容被随时修改,那么程序将变得不稳定
  • 线程安全,当多个线程同时访问字符串对象时,其不可变性保证了线程安全
  • HashCode唯一,不可变特性保证了hashcode唯一,从而更好的缓存
  • 性能,hashcode唯一,可做缓存,提升性能

String的长度

编译器,字符串长度为65535 运行期,字符串长度为int的最大长度,2^31-1=2147483647,因为字符串的length属性是int类型

intern方法使用

  • 如果字符串常量池没有,则将字符串的字面量放入
  • 返回字符串常量的引用

字面量:源代码中固定值的表示,比如 int a = 10, String b = "xxx", 10 和 "xxx" 都是字面量

编译期,字符串常量会被存储在常量池中,但运行期,动态生成的字符串没法预先存储在常量池,可以使用intern方法将常用的字符串直接放入常量池,提升效率

一些例子

String a = "xx"
String b = "x" + "x"
a == b // true, 编译器,a,b的字面量相等,其引用均指向字符串常量池的同一个字符串
String a = new String("x")
a.intern()
String b = "x"
a == b // false,a.intern()后并未将引用赋值,故a和b不相等

参考资料

Hollis 大神的《2023全新Java面试宝典课程,八股文学习资料》