五个刁钻的String面试问题及解答
共 3900字,需浏览 8分钟
· 2022-06-28
阅读本文大概需要 5 分钟。
来自:blog.csdn.net/u011541946/article/details/79865160
package string;
public class Demo2_String {
public static void main(String[] args) {
String st1 = "abc";
String st2 = "abc";
System.out.println(st1 == st2);
System.out.println(st1.equals(st2));
}
}
第一行:true
第二行:true
运行先编译,然后当前类Demo2_String.class文件加载进入内存的方法区
第二步,main方法压入栈内存
常量池创建一个“abc”对象,产生一个内存地址
然后把“abc”内存地址赋值给main方法里的成员变量st1,这个时候st1根据内存地址,指向了常量池中的“abc”。
前面一篇提到,常量池有这个特点,如果发现已经存在,就不在创建重复的对象
运行到代码 Stringst2 =”abc”, 由于常量池存在“abc”,所以不会再创建,直接把“abc”内存地址赋值给了st2
最后st1和st2都指向了内存中同一个地址,所以两者是完全相同的。
String st1 = new String(“abc”);
package string;
public class Demo2_String {
public static void main(String[] args) {
String st1 = new String("abc");
String st2 = "abc";
System.out.println(st1 == st2);
System.out.println(st1.equals(st2));
}
}
package string;
public class Demo2_String {
public static void main(String[] args) {
String st1 = "a" + "b" + "c";
String st2 = "abc";
System.out.println(st1 == st2);
System.out.println(st1.equals(st2));
}
}
package string;
public class Demo2_String {
public static void main(String[] args) {
String st1 = "ab";
String st2 = "abc";
String st3 = st1 + "c";
System.out.println(st2 == st3);
System.out.println(st2.equals(st3));
}
}
常量池创建“ab”对象,并赋值给st1,所以st1指向了“ab”
常量池创建“abc”对象,并赋值给st2,所以st2指向了“abc”
由于这里走的+的拼接方法,所以第三步是使用StringBuffer类的append方法,得到了“abc”,这个时候内存0x0011表示的是一个StringBuffer对象,注意不是String对象。
调用了Object的toString方法把StringBuffer对象装换成了String对象。
把String对象(0x0022)赋值给st3
推荐阅读:
互联网初中高级大厂面试题(9个G) 内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper......等技术栈!
⬇戳阅读原文领取! 朕已阅