Java-String

leard 发布于 2024-05-16 0 次阅读


public class Test1 {
   private static String s1;
   private static String s2;

   public static void main(String[] args) {
      String s= s1+s2;
      System.out.println(s);
   }
}

运行之后,会发现打印了nullnull

s1和s2没有经过初始化所以都是空对象null,需要注意这里不是字符串的"null",打印结果的产生我们可以看一下字节码文件:

编译器会对String字符串相加的操作进行优化,会把这一过程转化为StringBuilder的append方法。

public AbstractStringBuilder append(String str) {
    if (str == null)
    return 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;
}

如果append方法的参数字符串为null,那么这里会调用其父类AbstractStringBuilder的appendNull方法。这里的value就是底层用来存储字符的char类型数组,到这里我们就可以明白了,其实StringBuilder也对null的字符串进行了特殊处理,在append的过程中如果碰到是null的字符串,那么就会以"null"的形式被添加进字符数组,这也就导致了两个为空null的字符串相加后会打印为"nullnull"。