我们在使用java的基本类型boolean时候,有没有思考过,以下这两种方式有什么区别呢?
boolean sign = true;
if (sign) {
//TODO
}
if (sign == true) {
//TODO
}
它们一样吗?
我们编写一个类,命名为BaseTypeBoolean.java,然后利用javac工编译为BaseTypeBoolean.class,再利用javap反编译如下:
我们可以看到这两种方式,使用了两条不同的字节码指令,if(sign) 对应ifeq,if(sign == true)对应if_icmpne
这里出现了,iconst_1, 难道是表示1吗?大胆假设小心求证,我们写如下代码,反编译试试看:
public class BaseTypeInt {
public void intVar() {
int one = 1;
int two = 2;
int three = 3;
}
}
反编译结果如下:
果然,iconst_1就是对应1, 那么boolean sign = true, int a = 1; 他们是一样的吗?
我们改写代码如下:
public class BaseTypeInt {
public void intVar() {
int one = 1;
int zero = 0;
boolean T = true;
boolean F = false;
}
}
编译,然后反编译,结果如下:
再次验证了我们的猜想。java基本类型boolean在JVM上的实现就是int, true为1, false为0。
【注意】:java规范和JVM规范是分开的,java语言中有boolean类型,而jvm中则是使用int来实现boolean。java源文件一旦被javac编译成字节码文件以后,就从java地盘进入jvm地盘了,需要按照jvm的规矩办事了。
【问题】:文中验证方式有什么问题吗?有没有更好的验证方式?如果真是文中所讲,jvm为什么要将boolean实现为int?