java的null相加_Java字符串null相加

最近和同事讨论了下面的一段代码:

String a = null;

a += a;

System.out.println(a);

运行结果:

nullnull

本着学习的态度研究了一下这段代码,在本地将上面代码编写之后使用javap反编译Java字节码文件得到下面字节命令:

Code:

0: aconst_null

1: astore_1

2: new #16 // class java/lang/StringBuilder

5: dup

6: aload_1

7: invokestatic #18 // Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;

10: invokespecial #24 // Method java/lang/StringBuilder."":(Ljava/lang/String;)V

13: aload_1

14: invokevirtual #27 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

17: invokevirtual #31 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;

20: astore_1

21: getstatic #35 // Field java/lang/System.out:Ljava/io/PrintStream;

24: aload_1

25: invokevirtual #41 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

28: return

原来编译器对字符串相加会进行优化,首先创建一个StringBuilder对象,然后把相加的字符串按顺序append,最后调用toString方法返回一个String对象。

还是看一下源码StringBuilder的append方法是如何处理null的吧。

public StringBuilder append(String str) {

super.append(str);

return this;

}

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;

}

append方法会判断传入对象如果为null,就会调用appendNull方法,appendNull方法填充了一个char[]数组,其内容为"null"。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值