更多 Java 基础知识方面的文章,请参见文集《Java 基础知识》
打印 null 字符串
示例:
String str = null;
System.out.println(str); // null
原因分析:PrintStream
类中包含如下代码,做了 null
的特殊判断
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
打印 null 对象
示例:
Object obj = null;
System.out.println(obj); // null
原因分析:PrintStream
类中包含如下代码,将对象转换成字符串
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
而 String
类中的 valueOf
方法定义如下,做了 null
的特殊判断:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
打印 null 对象与字符串拼接
示例:
String s = null + "123";
System.out.println(s); // null123
原因分析:
编译器对字符串相加会进行优化,首先实例化一个 StringBuilder
,然后把相加的字符串按顺序 append
,最后调用 toString
返回一个 String
对象。
StringBuilder
中的 append
方法做了 null
的特殊判断,如下:
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
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;
}