zoukankan      html  css  js  c++  java
  • 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."<init>":(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"。

  • 相关阅读:
    Identity Server4学习系列三
    C# 多线程九之Timer类
    Identity Server4学习系列二之令牌(Token)的概念
    Identity Server4学习系列一
    C# 多线程八之并行Linq(ParallelEnumerable)
    使用Resourcehacker去除winrar的弹窗广告
    remote: Coding 提示: Authentication failed问题解决
    使用Python读取照片的GPS信息
    mongoose删除mongodb某个库的所有collection
    mysql数据库查询占用空间
  • 原文地址:https://www.cnblogs.com/new0801/p/6146602.html
Copyright © 2011-2022 走看看