不说别的先看代码截图:
结果如下:
很好奇为什么String对象的null加上了""就等于"null"字符串了,先给点资料看看:
这个是我找的一个人博客上的截图,null不是任何对象的类型,那么这个到底是怎么实现的呢?
机制的我又找到了一点资料:
L0
LINENUMBER 27 L0
ACONST_NULL
ASTORE 1
L1
LINENUMBER 28 L1
NEW java/lang/StringBuilder
DUP
INVOKESPECIAL java/lang/StringBuilder.<init> ()V
ALOAD 1
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
LDC "!"
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
ASTORE 1
L2
LINENUMBER 29 L2
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ALOAD 1
INVOKEVIRTUAL java/io/PrintStream.print (Ljava/lang/String;)
这个是我找到的一个字节码的截图,就是java编译器对于+这个操作的优化,算了,直接说吧:
当我们在程序中使用了字符串相加的话,编译器就会对这个进行优化,先实例化一个stringbuilder对象,然后把相加的字符串一个个的apend进去,
然后就.tostring了,转换成字符串了。其中对于null会转换成null字符串来接收他。源代码如下:
/针对 String 对象 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; } //针对非 String 对象 public AbstractStringBuilder append(Object obj) { return append(String.valueOf(obj)); } 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; }
简单易懂,下面给个demo看看:
结果如下: