String.intern()
原理
- https://www.processon.com/diagraming/6145a3817d9c08198c57b975 ```java String s1 = “abcefg”; String s2 = new String(“abcefg”); String s3 = “abc”; String s4 = “efg”; String s5 = “abc”+”efg”; String s6 = s3+s4; System.out.println(s1 == s2);//s2是一个新的对象,地址和常量池中的s1肯定不相同(false) System.out.println(s1 == s5);//预编译优化,相同(true) System.out.println(s1 == s6);//s6创建了StringBuilder,调用了toString(),相当于new了一个新String(),不相同(false) System.out.println(s1 == s6.intern());//new String().intern—>常量池中有该字符串吗—->有—->返回字符串地址,(true) System.out.println(s2 == s2.intern());//s2是一个对象地址,inter()之后是常量池中字符串地址,(false)
//测试 System.out.println(); String s7 = new String(“abc”)+new String(“efg”); System.out.println(s1 == s7.intern());//true ```
StringBuilder&StringBuffer
StringBuffer 默认初始化容量16,最好在创建String Buffer对象的时候给定一个初始化容量,因为String Buffer底层是char[],数组,虽然会自动扩容,但是需要创建一个容量更大的char[]数组来替换掉原来的数组,所以为了代码的执行效率,建议按照估计给定StringBuffer一个初始化容量。
而StringBuilder除了是非线程安全的外,其他和StringBuffer相同。