【86期】五个刁钻的String面试问题及解答
共 3901字,需浏览 8分钟
·
2020-11-11 04:16
阅读本文大概需要 5 分钟。
来自:blog.csdn.net/u011541946/article/details/79865160
1.判定定义为String类型的st1和st2是否相等,为什么
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
分析:
将此字符串与指定的对象比较。当且仅当该参数不为null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。
运行先编译,然后当前类Demo2_String.class文件加载进入内存的方法区
第二步,main方法压入栈内存
常量池创建一个“abc”对象,产生一个内存地址
然后把“abc”内存地址赋值给main方法里的成员变量st1,这个时候st1根据内存地址,指向了常量池中的“abc”。
前面一篇提到,常量池有这个特点,如果发现已经存在,就不在创建重复的对象
运行到代码 Stringst2 =”abc”, 由于常量池存在“abc”,所以不会再创建,直接把“abc”内存地址赋值给了st2
最后st1和st2都指向了内存中同一个地址,所以两者是完全相同的。
2. 下面这句话在内存中创建了几个对象
String st1 = new String(“abc”);
分析:
3.判定以下定义为String类型的st1和st2是否相等
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));
}
}
4. 判定以下定义为String类型的st1和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));
}
}
5.判断以下st2和st3是否相等
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
总结:
推荐阅读:
【85期】谈谈Java面向对象设计的六大原则,中高级面试常问!
【84期】面试中设计模式能问些什么?比如说一下三种单例模式实现
【83期】面试被问到了Redis和MongoDB的区别?看这里就对了
微信扫描二维码,关注我的公众号
朕已阅