问题描述
public class testNull {/** * @param args */public static void main(String[] args) {String a=null;String b="";String c=b+a; //String c=b+a;System.out.println(c);//输出都为null}}结果都为null,有人可以帮助解释一下吗?
解决方案
对String的+操作实际上是通过StringBuffer实现的,也就是append方法该方法会将将null转换为“null”字符串,所以得到的结果是c="null"
解决方案二:
String a=null; 'aconst_null 'astore_0String b=""; 'ldc "" 'astore_1String c=b+a; 'new Ljava/lang/StringBuilder; 'invoke_special Ljava/lang/StringBuilder.<init>()V 'aloat_1 'invoke_virtual Ljava/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder; 'aloat_0 'invoke_virtual Ljava/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder; 'invoke_virtual Ljava/lang/StringBuilder.toString()Ljava/lang/String; 'astore_2System.out.println(c); 'get_static Ljava/lang/System.out; 'aload_2 'invoke_virtual Ljava/io/PrintWriter.println(Ljava/lang/String;)V编译器在处理string的+运算时使用的是StringBuilder如上面的字节码,b和c的相加是通过两次调用stringbuilder.append方法实现,第一次调用时参数是"",此时stingbuilder的内容没有变化,第二次调用的参数为null,此时stringbuilder的内容为“null” ,然后调用toString方法并将结果赋值给c参考AbstractStringBuilder的append实现public AbstractStringBuilder append(String str) { //当参数为null时设置参数为"null"388 if (str == null) str = "null";389 int len = str.length();390 if (len == 0) return this;391 int newCount = count + len;392 if (newCount > value.length)393 expandCapacity(newCount);394 str.getChars(0, len, value, count);395 count = newCount;396 return this;397 }
解决方案三:
具体原因不是很明确,不过String b = "|";String a = null;Integer i = null;Object o = null;boolean s1 = true;boolean s2 = false;String c = a + b + i + b + o + b + null + b + s1 + b + s2;System.out.println(c);从上面代码可以看出 String 相加操作,对于正常的对象类型,采取的策略是“Java 语言提供对字符串串联符号("+")和其他对象到字符串的转换的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中所有类继承”而对于一下类型的数据,则转换为一种字符串意义的表达null -- "null "true -- "true "false -- "false " 希望有人能从VM角度解释一下 共同学习
解决方案四:
二楼说的是,一楼的还得回去复习
解决方案五:
输出一下 a == null 和 c == null,就看到不同了
解决方案六:
null是一个关键字,用来标识一个不确定的对象。因此可以将null赋给引用类型变量,但不可以将null赋给基本类型变量。String a=null; String b=""; String c=b+a; a 是String 类型 但是他是不确定的对象! 是 null b 是string 类型 确定的 字符串对象 分配了内存的!a+b =c c 也是不确定的对象! 所以是null