以下程序的运行结果?
public static void main(String[] args) {
System.out.println("hello" + null );
System.out.println( null + "world" );
}
|
|
|
|
|
|
|
|
|
|
答案:
hellonull
nullworld
解析:String是一个类,“+”是String的拼接操作。
我们知道,在类中所有的“操作”都应该对应于一个方法。那么“+”对应哪个方法呢?
实际上,当有变量参与字符串的拼接操作时,String会借用StringBuilder对象的append()方法来完成。(JDK1.5之前借用StringBuffer)
那么看一下append()方法的源码就知道原因了,append()在JDK中的源码如下。
public StringBuilder append(String str) {
super.append(str);
return this;
}
其中super.append()调用的是父类AbstractStringBuilder中的append(),父类中append()的源码如下。
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;
}
从源码可知,当拼接null时,会调用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;
}
相信写的很明白了,会依次给char[]数组拼接'n','u','l','l'四个字符。
综上,本文重点是:String的"+"会调用StringBuilder的append()方法,然后顺着调用关系往下查阅源码即可知答案。
有一个问题:我是怎么知道String的“+”在底层调用的是其他类的append()方法?因为是String类的源码注释经告诉我了,如图。
看源码,是不是比查谷歌更快一些?
- 完 -