jdk源码探索 - Boolean类

jdk 8 中的Boolean 类源码分析:

1. 此类为 final类,表明它不能被继承了,因为它是一个基础类, 且实现了Serializable接口和Comparable接口,表明这个类的对象可以实现序列化及比较操作. 

public final class Boolean implements java.io.Serializable, Comparable<Boolean>

2. 它有两个有参构造方法,但没有无参构造方法:

public Boolean(boolean value) {
        this.value = value;
}

public Boolean(String s) {
        this(parseBoolean(s));   //调用了上面的构造方法完成初始化. 
}

这其中的value是 

 private final boolean value;  //常量,一旦赋值,即不能修改了. 

值得注意的是它的第二个构造方法调用的 parseBoolean()的实现。

public static boolean parseBoolean(String s) {
        return ((s != null) && s.equalsIgnoreCase("true"));
}

这一句代码有点冗余了,可以改成, 结果和上面一样( 如s为 "true",则返回true, 否则返回false ),但性能要更好一些。 

public static boolean parseBoolean(String s) {
        return "true".equalsIgnoreCase( s );
}

幸运地是,jdk11中已经修改了这个函数,如下图: 

3。 另一个有意思的方法是  hashCode()

 public static int hashCode(boolean value) {
        return value ? 1231 : 1237;
}

问题一: 为什么 value为true时hashcode 为1231,而value为false时hashcode值为1237呢? 

      因为1231和1237是两个比较大的素数(质数), 采用素数做为hashcode值可以尽可能的离散hash表中存储的数据,, 毕竟hashCode的主要目的就是为了提高诸如java.util.HashMap这样的散列表(hash table)的性能,尽量防止hash碰撞. 

问题二: 为什么是1231和1237两个素数而不是其它的值呢?

      Boolean只有truefalse两个值,理论上任何两个素数都可以.但是在实际使用时,可能作为key的不只是Boolean一种类型啊,可能还会有其它类型,比如最常见的字符串作为key,还有Integer作为key.至少要保证避开常见hashCode的取值范围吧, Integer还缓存了常用的256个数字着呢…但是太大了也没意义,比如说字符串"00"的hashCode为1536,BooleanhashCode取值太大的话,指不定又跟字符串的hashCode撞上了,更别说其它对象的了.所以BooleanhashCode取值也是一个不能太小也不能太大.  

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangyingchengqi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值