java boolean研究

13 篇文章 0 订阅
2 篇文章 0 订阅

我们在使用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?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值