先来个面试题吧
面试题一
- String a = "ab";
- String b = "a" + "b";
- sysout(a==b)
答案是 true 还是 false 呢?
我们来一起分析一下这个过程
a 变量创建时, 会在常量池中开辟一块空间存放 ab, 然后将空间地址赋值给 a;
b 变量创建时, 编译器会自动将 + 的结果运算出来, 相当于 b == "ab", 此时 JVM 会先判断常量池中是否存在, 直接将该对象的地址引用赋值给 b 变量, 因此 a 跟 b 都是指向的常量池中的同一块地址, 所以答案是 true.
面试题二
- String a = "ab";
- String b = new String("ab");
- sysout(a==b)
a 变量的创建跟上一题一样
b 使用 new String(str) 方式创建字符串时, 如果常量池中存在, 则拷贝一份放到堆中, 并将堆中的地址指向 b; 如果常量池中不存在, 则新建一份放到常量池中, 并拷贝一份放到堆里, 并将堆里的地址指向 b. 所以 a 字符串在常量池中的值跟 b 所指向的不是同一份, 答案为 false.
来源: http://www.bubuko.com/infodetail-3085927.html