面试官再问String面试题,教你如何满分回答
- 判定定义为String类型的st1和st2是否相等,为什么?
public class Compare_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
分析:
== 比较运算符,如果是基本数据类型,比较的是值是否相等,如果是引用数据类型,比较的是地址值是否相等,’‘abc’'是存储在常量池中的,常量池有一个特点,如果已经存在,就不会再重复的创建对象,所以两个str1、str2是指向的同一个地址,赋值给两个字符串对象,故(str1 == str2)输出为true。
使用equals()方法既要比较地址值又要比较值是否相同,所以str1.equals(str2)输出也为true。
- 下面这句话在内存中创建了几个对象?
String st1 = new String(“abc”);
输出结果:
2个
分析:
在内存中创建了两个对象,new 是在堆内存中创建的对象,’‘abc’'是在常量池中创建的对象。堆内存中的对象是常量池对象的一个拷贝副本。
当我们看到了new这个关键字,就要想到只要是new出来的对象都是在堆内存中存储
- 判定以下定义为String类型的st1和st2是否相等?
package string;
public class Compare_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));
}
}
输出结果:
false、true
分析:
new关键字,对象的引用指向堆内存,"abc"在常量池中
- 判定以下定义为String类型的st1和st2是否相等
public class Compare_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));
}
}
输出结果:
true、true
分析:
“a” + “b” + "c"本来就是字符串常量,字符串拼接后还是字符串,在常量池中存储,常量池中存在一个对象就不会再重复创建一个相同的对象,所以都为true。
- 判断以下st2和st3是否相等
package string;
public class Compare_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));
}
}
输出结果:
false、true
分析:
在JDK 1.6中对String对象的介绍中,Java语言提供对字符串拼接 ‘’+“以及将对象转换为字符串的特殊支持,字符串串联是通过StringBuilder或者StringBuffer类及其append方法实现的,字符串转换是通过toSting方法实现的。
也就是说由StringBuilder或者StringBuffer类和里面的append方法实现拼接,然后调用 toString() 把拼接的对象转换成字符串对象,最后把得到字符串对象的地址赋值给变量。
对象str1和str2都是指向常量池,对象str3显示通过StringBuilder类的append方法的到了"abc”,他是一个StringBuilder对象,在堆内存中存储001,再通过toString() 转换为了String对象,堆内存中存储002,然后赋值给str3.所有st2 == st3内存地址不一样了,输出为false。
内容相同st2.equals(st3)为true。