这是如何运作的?我似乎找不到答案。
boolean bool=true;
System.out.println("the value of bool is : " + true);
//or
System.out.println("the value of bool is : " + bool);
- 幕后到底发生了哪些事情?
- 由于布尔值不能隐式转换,因此布尔值如何转换为字符串
类型转换?
- Is 自动装箱/拆箱涉及?
- 方法是这样的
toString()
or String.valueOf()
以某种方式参与?
确切的规则在 Java 语言规范中有详细说明,§5.1.11。字符串转换
根据这些规则,"str" + bool
相当于:
"str" + new Boolean(bool).toString()
也就是说,编译器在如何准确计算整个表达式方面有相当大的余地。来自JLS§15.18.1。字符串连接运算符 +:
一种实现可以选择一步执行转换和串联,以避免创建然后丢弃中间 String 对象。为了提高重复字符串连接的性能,Java 编译器可以使用StringBuffer
类或类似的技术来减少中间的数量String
通过计算表达式而创建的对象。
对于原始类型,实现还可以通过直接从原始类型转换为字符串来优化包装对象的创建。
例如,我的编译器如下:
boolean bool = true;
System.out.println("the value of bool is : " + bool);
完全等同于:
boolean bool = true;
System.out.println(new StringBuilder("the value of bool is : ").append(bool).toString());
它们产生相同的字节码:
Code:
0: iconst_1
1: istore_1
2: getstatic #59 // Field java/lang/System.out:Ljava/io/PrintStream;
5: new #166 // class java/lang/StringBuilder
8: dup
9: ldc #168 // String the value of bool is :
11: invokespecial #170 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
14: iload_1
15: invokevirtual #172 // Method java/lang/StringBuilder.append:(Z)Ljava/lang/StringBuilder;
18: invokevirtual #176 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
21: invokevirtual #69 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
24: return
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)