签名:但行好事,莫问前程。
前言
记录一下StringTable常见面试题分析。
StringTable的特性:
- 常量池中的字符串仅是符号,第一次用到时才变为对象
- 串池中保存的是字符串常量对象
- 利用串池的机制,来避免重复创建字符串对象
- 字符串变量拼接的原理是 StringBuilder (1.8)
- 字符串常量拼接的原理是编译期优化
先看代码:
public class StringTableDemo {
// StringTable [] 串池 hashtable结构,不能扩容
public static void main(String[] args) {
String s1 = "a";
String s2 = "b";
String s3 = "ab"; // StringTable ["a","b","ab"] 当代码执行到这一步,"a","b","ab" 都被加载到串池中
String s4 = s1 + s2; // new StringBuilder().append("a").append("b").toString() => new String("ab") 我们知道,new出来的对象都存在堆中
System.out.println(s3 == s4); // 堆中的s4和串池中的s3不是同一个对象,所以结果是:false
// javac 在编译期间的优化,两个常量字符串"a"和"b"的拼接结果就是字符串"ab"
String s5 = "a" + "b"; // 当代码执行到这一步,会先去串池中找有没有“ab”字符串对象,没有的话,将“ab”字符串加入串池;有的话,直接引用串池中的“ab”对象
System.out.println(s3 == s5); // s3和s5都是指向串池中的“ab”字符串对象,所以结果是:true
}
}
运行结果:
总结
博客主要记录了StringTable常见面试题分析,有啥错误或不足地方请指正,如果对你有所帮助,请一键三连。