在大厂的Java面试中,关于字符串比较的问题不仅考察你对String
类方法的理解,还考察你对Java中字符串池、字符串不可变性等概念的深入了解。以下是几个可能出现在面试中关于Java字符串比较方法的问题,每个问题都附带了源码示例和相应的解释,旨在帮助你准备面试。
面试题1:equals()
与==
的区别
问题描述:
解释String
类中equals()
方法和==
操作符在比较字符串时的区别,并提供示例代码说明。
源码示例:
public class StringComparison {
public static void main(String[] args) {
String s1 = new String("example");
String s2 = "example";
String s3 = "example";
System.out.println(s1 == s2); // 输出1
System.out.println(s1.equals(s2)); // 输出2
System.out.println(s2 == s3); // 输出3
}
}
解释:
==
:比较操作符==
用于比较两个对象的引用是否相同,即它们是否指向内存中的同一个位置。equals()
:String
类重写了Object
类的equals()
方法,用于比较两个字符串的内容是否相等。
输出解释:
- 输出1:
false
,因为s1
是通过new
关键字创建的,指向堆内存中的一个对象,而s2
是字面量赋值的,指向字符串常量池中的对象,它们的引用不同。 - 输出2:
true
,因为equals()
方法比较的是字符串的内容,s1
和s2
的内容相同。 - 输出3:
true
,因为s2
和s3
都是通过字面量方式赋值的,它们引用的是字符串常量池中的同一个对象。
面试题2:compareTo()
方法的使用
问题描述:
解释String
类中compareTo()
方法的作用,并给出示例代码说明如何使用该方法比较两个字符串。
源码示例:
public class CompareToExample {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
String s3 = "hello";
System.out.println(s1.compareTo(s2)); // 输出1
System.out.println(s1.compareTo(s3)); // 输出2
System.out.println(s2.compareTo(s1)); // 输出3
}
}
解释:
compareTo()
方法用于按字典顺序比较两个字符串。如果字符串相等,方法返回0;如果调用字符串(s1
)小于参数字符串(s2
),则返回值小于0;如果s1
大于s2
,则返回值大于0。
- 输出1:返回一个小于0的值,因为
s1
(“hello”)按字典顺序小于s2
(“world”)。 - 输出2:返回0,因为
s1
和s3
内容相同。 - 输出3:返回一个大于0的值,因为
s2
(“world”)按字典顺序大于s1
(“hello”)。
面试题3:字符串常量池的影响
问题描述:
给定以下代码,解释为什么str1.equals(str3)
和str2 == str3
的结果不同。
源码示例:
public class StringPoolEffect {
public static void main(String[] args) {
String str1 = new String("pool");
String str2 = "pool";
String str3 = str1.intern();
System.out.println(str1.equals(str3)); // 输出1
System.out.println(str2 == str3); // 输出2
}
}
解释:
str1.equals(str3)
返回true
,因为equals()
方法比较的是两个字符串的内容,而str1
和str3
的内容相同。str2 == str3
返回true
,因为str1.intern()
返回的是字符串常量池中"pool"的引用,这与str2
直接指向的常量池中的"pool"是同一个引用。
这个问题旨在考察面试者对字符串常量池的理解,以及intern()
方法的作用,它可以用来确保字符串来自常量池,从而允许使用==
操作符进行比较。
以下是三道与Java字符串比较方法相关的面试题,包括源码示例和问题解析。这些题目旨在考察面试者对字符串比较、字符串常量池以及字符串不可变性的理解。
面试题1:字符串常量池探索
问题描述:
考虑以下Java代码。解释输出结果并说明原因。
源码示例:
public class StringConstantPool {
public static void main(String[] args) {
String s1 = "Java";
String s2 = "Java";
String s3 = new String("Java");
System.out.println(s1 == s2); // 输出1
System.out.println(s1 == s3); // 输出2
System.out.println(s1.equals(s3)); // 输出3
}
}
解释:
- 输出1:
true
,因为s1
和s2
都是通过字符串字面量创建的,它们指向字符串常量池中的同一个对象。 - 输出2:
false
,因为s3
是通过new
关键字创建的,这会在堆上创建一个新的字符串对象,即使其内容相同,s1
和s3
的引用也不相同。 - 输出3:
true
,equals()
方法比较的是两个字符串的内容,而不是引用,因此即使s1
和s3
引用不同,它们的内容相同,结果为true
。
面试题2:intern()
方法使用
问题描述:
通过下面的代码,解释intern()
方法的作用及其对字符串比较的影响。
源码示例:
public class StringIntern {
public static void main(String[] args) {
String s1 = new String("intern");
String s2 = s1.intern();
String s3 = "intern";
System.out.println(s1 == s2); // 输出1
System.out.println(s2 == s3); // 输出2
}
}
解释:
intern()
方法确保所有相同内容的字符串都指向字符串常量池中的同一个对象。- 输出1:
false
,因为s1
是通过new
创建的,位于堆上,而s2
是s1
内容在常量池中的引用,即使内容相同,它们的引用不同。 - 输出2:
true
,s2
和s3
都指向字符串常量池中相同内容的单一对象。intern()
方法使s2
引用常量池中的对象,而s3
直接引用常量池中的对象。
面试题3:比较equals()
与compareTo()
问题描述:
解释equals()
方法与compareTo()
方法在字符串比较中的不同用途,并通过示例代码说明。
源码示例:
public class StringComparisonMethods {
public static void main(String[] args) {
String str1 = "abc";
String str2 = "abc";
String str3 = "abd";
// 使用equals()比较
System.out.println(str1.equals(str2)); // 输出1
System.out.println(str1.equals(str3)); // 输出2
// 使用compareTo()比较
System.out.println(str1.compareTo(str2)); // 输出3
System.out.println(str1.compareTo(str3)); // 输出4
}
}
解释:
equals()
方法用于检查两个字符串的内容是否完全相同。如果两个字符串相同,返回true
;否则返回false
。compareTo()
方法用于按字典顺序比较两个字符串。如果字符串相等,返回0;调用字符串小于参数字符串,返回小于0的值;调用字符串大于参数字符串,返回大于0的值。- 输出1:
true
,因为str1
和str2
内容相同。 - 输出2:
false
,因为str1
和str3
内容不同。 - 输出3:
0
,因为str1
和str2
内容相同,按字典顺序相等。 - 输出4:返回一个小于0的值(如
-1
),因为str1
(“abc”)按字典顺序小于str3
(“abd”)。
这些题目旨在考察面试者对Java字符串操作的深入理解,包括字符串常量池的工作原理、字符串不可变性的影响,以及不同字符串比较方法的适用场景。