java String 的+操作导致的问题

java String 的+操作导致的问题

不说别的先看代码截图:

java String 的+操作导致的问题

结果如下:

java String 的+操作导致的问题

很好奇为什么String对象的null加上了""就等于"null"字符串了,先给点资料看看:

java String 的+操作导致的问题

这个是我找的一个人博客上的截图,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看看:

java String 的+操作导致的问题

结果如下:

java String 的+操作导致的问题


 
上一篇:邻接表无向图(二)之 C++详解


下一篇:IOS 键盘弹出导致的position:fixed 无效问题