String常见面试题
首先我们需要了解一下==和equals的区别
1. == :既可以比较基本数据类型,也可以比较引用数据类型。比较基本数据类型时比较的是值,引用数据类型比较的是地址。
2. equals:只能比较引用数据类型。如果该引用数据类型没有重写Object类中的方法,equals比较的是地址,重写后的比较的是值。
具体可以参考:双等号==和equals的区别_IT盛夏的果实的博客-CSDN博客_双等号和equals的区别、
判断string类型的s1和s2是否相等
1)
String str1 = "ab";
String str2 = "ab";
System.out.print(str2 == str1); //true
System.out.println(str1.equals(str2)); //true
str2 == str1:比较地址值,都在常量值中,相等。
str1.equals(str2):string重写equals方法,比较的是数值,相等
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
} else {
if (anObject instanceof String) {
String aString = (String)anObject;
if (this.coder() == aString.coder()) {
return this.isLatin1() ? StringLatin1.equals(this.value, aString.value) : StringUTF16.equals(this.value, aString.value);
}
}
return false;
}
}
2)
String str1 = "a"+"b";
String str2 = "ab";
System.out.print(str2 == str1); //true
System.out.println(str1.equals(str2)); //true
str2 == str1:比较地址值,都在常量值中,相等。
str1.equals(str2):string重写equals方法,比较的是数值,相等
3)
String str1 = "a";
String str2 = "ab";
String str3 = str1+"b";
System.out.println(str2 == str3); //false
System.out.println(str2.equals(str3)); //true
str2 == str1 : 双等引用数据类型比较地址值。对于字符串引用的 + 号连接问题,由于字符串引用在编译期是无法确定下来的,在程序的运行期动态分配并创建新的地址存储对象。str3在堆内存中,str2在常量池。所以地址值是不同的
str2.equals(str3):string重写equals方法,比较的是数值,相等
4)
final String str1 = "a";
String str2 = "ab";
String str3 = str1+"b";
System.out.println(str2 == str3); //true
System.out.println(str2.equals(str3)); //true
str2 == str1 : 双等引用数据类型比较地址值。final 修饰的变量是一个常量,编译期就能确定其值。所以 str1 + "b"就等同于 "a" + "b",两者地址值都在常量池中,所以结果是 true。
str2.equals(str3):string重写equals方法,比较的是数值,相等。
String s1 = new String("abc")创建了几个对象?
答案:两个,一个常量池中的对象,一个new String()对象
我们可以查看它的字节码验证下:

以下代码执行过程中创建了几个对象?
String str1 = "a"; String str2 = "b"; String str3 = str1 + str2;分析其字节码以上代码等价于
String string = new StringBuilder().append(str1).append(str2).toString();
答案:4个一个常量池中的对象a,一个常量池中的对象b,还有一个拼接的StringBuilder对象以及toString()中的一个new String()对象

参考博客:java String类常见面试题_chaobin6的博客-CSDN博客_java string面试题
想要了解更多编程小知识,快来关注公众号:爪哇开发吧!每周会不定时的进行更新。



浙公网安备 33010602011771号