String 类常见面试题总结
这篇文章是我的一位好朋友 Hydra(公众号码农参上号主)写的原创干货,经他同意,我将其整理到了 《Java 面试指北》的 Java 部分。
说明:这里主要使用的是 JDK 8 版本进行测试。
String 字符串是我们日常工作中常用的一个类,在面试中也是高频考点,这里精心总结了一波常见但也 有点烧脑的 String 面试题,一共 5 道题,难度从简到难,来一起来看看你能做对几道吧。
说明 :本文基于jdk8版本中的 String 进行讨论,文章例子中的代码运行结果基于Java 1.8.0_261-b12
第 1 题,奇怪的 nullnull
下面这段代码最终会打印什么?
public class Test1 {
private static String s1;
private static String s2;
public static void main(String[] args) {
String s= s1+s2;
System.out.println(s);
}
}
运行之后,你会发现打印了nullnull
:
在分析这个结果之前,先扯点别的,说一下为空null
的字符串的打印原理。查看一下PrintStream
类的源码,print
方法在打印null
前进行了处理:
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
因此,一个为null
的字符串就可以被打印在我们的控制台上了。
再回头看上面这道题,s1
和s2
没有经过初始化所以都是空对象null
,需要注意这里不是字符串的"null"
,打印结果的产生我们可以看一下字节码文件:
编译器会对String
字符串相加的操作进行优化,会把这一过程转化为StringBuilder
的append
方法。那么,让我们再看看append
方法的源码:
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
//...
}
如果append
方法的参数字符串为null
,那么这里会调用其父类AbstractStringBuilder
的appendNull
方法:
private AbstractStringBuilder appendNull() {
int c = count;
ensureCapacityInternal(c + 4);
final char[] value = this.value;
value[c++] = 'n';
value[c++] = 'u';
value[c++] = 'l';
value[c++] = 'l';
count = c;
return this;
}
这里的value
就是底层用来存储字符的char
类型数组,到这里我们就可以明白了,其实StringBuilder
也对null
的字符串进行了特殊处理,在append
的过程中如果碰到是null
的字符串,那么就会以"null"
的形式被添加进字符数组,这也就导致了两个为空null
的字符串相加后会打印为"nullnull"
。