返回
关于Java 字符串的常见面试题:深度解析
Android
2023-09-27 16:12:39
序言
掌握 Java 字符串操作是任何 Java 程序员职业生涯中的基石。面试官经常通过提出与字符串操作相关的尖锐问题来评估候选人的技能。本文旨在深入探讨 Java 字符串面试中的常见问题,深入剖析它们的答案,从而提升您在这方面的知识和应变能力。
问题 1:字符串的 immutability 和 equals 方法
问题: 下面程序的运行结果是什么?
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
String str4 = new String("Hello");
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
System.out.println(str3 == str4); // false
System.out.println(str1.equals(str3)); // true
答案:
- str1 == str2: 为 true 。Java 字符串是不可变的,这意味着创建后就不能修改。在编译时,编译器会对相同内容的字符串进行池化,这意味着 str1 和 str2 指向同一个对象,因此比较为 true。
- str1 == str3: 为 false 。虽然 str1 和 str3 具有相同的内容,但它们是使用 new 创建的不同的对象,因此比较为 false。
- str3 == str4: 为 false 。与前一个示例类似,str3 和 str4 是使用 new 关键字创建的不同对象,因此比较为 false。
- str1.equals(str3): 为 true 。equals 方法已被重写为在 Java 字符串中进行值比较。因此,即使 str1 和 str3 是不同的对象,它们的内容仍然相同,因此 equals 比较返回 true。
问题 2:substring 方法的实现
问题: 以下 str1.substring 方法的实现有何问题?
public class StringDemo {
public static void main(String[] args) {
String str1 = "Hello World";
String substring = str1.substring(2, 5); // 尝试获取索引 2 到 4 之间的子字符串
System.out.println(substring); // 输出:"llo"
}
}
答案:
给定的实现存在以下问题:
- 索引越界: substring 方法需要两个参数:开始索引和结束索引(不包含在内)。在这个示例中,我们指定了开始索引为 2 和结束索引为 5,这会产生索引越界错误,因为字符串的有效索引从 0 到 10(长度减 1)。
- 正确的实现: 正确的实现应该是:
String substring = str1.substring(2, 4); // 索引 2 到 3(不包含在内)
问题 3:优化 Java 字符串连接
问题: 优化以下 Java 代码以提高字符串连接性能:
String result = "";
for (int i = 0; i < 10000; i++) {
result += "Hello " + i;
}
答案:
有多种方法可以优化此代码以提高性能:
- 使用 StringBuilder: StringBuilder 类是一种可变字符序列,旨在高效地执行多次字符串连接操作。我们可以使用它来替换结果字符串:
StringBuilder resultBuilder = new StringBuilder();
for (int i = 0; i < 10000; i++) {
resultBuilder.append("Hello ").append(i);
}
String result = resultBuilder.toString();
- 使用 StringJoiner: Java 8 引入了 StringJoiner 类,它专门用于高效连接字符串。我们可以使用它来替换结果字符串:
StringJoiner resultJoiner = new StringJoiner(" ");
for (int i = 0; i < 10000; i++) {
resultJoiner.add("Hello " + i);
}
String result = resultJoiner.toString();
- 使用 Stream API: Java 8 的 Stream API 也可用于高效连接字符串。我们可以使用它来替换结果字符串:
String result = IntStream.range(0, 10000)
.mapToObj(i -> "Hello " + i)
.collect(Collectors.joining(" "));
总结
深入理解 Java 字符串操作是成为一名合格的 Java 程序员的关键。通过仔细分析常见的面试题并理解其背后的机制,您可以大幅提升您的技能水平,在面试中脱颖而出。本文涵盖的面试题提供了 Java 字符串概念的扎实基础,让您能够自信地应对技术挑战。