"hello"+null = ?

以下程序的运行结果?

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类的源码注释经告诉我了,如图。

 

 

看源码,是不是比查谷歌更快一些?

 

- 完 -

 

读者交流 | JAVA过时了吗?

自己写的java.lang.String能用吗?

答疑 | synchronized有指令重排序的功能吗?

服了,list.add()也会报错!!!

一道JVM面试题,答错率超90%

10行代码2道题,全答对的你月薪多少了?

自己写的java.lang.String能用吗?

技术面试,这些坑你踩过几个?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值