java中Boolean的JDK代码(JDK1.7)

Boolean是基础类型boolean的包装类,在jdk中代码也比较简单,其中有两个构造器,传string参数的构造器、parseBoolean(String)、valueOf(String)、getBoolean(String)方法内部调用的都是toBoolean(String)方法,区别就是valueOf(String)方法返回的是Boolean对象,而其他两个方法返回的是基本类型boolean;

    private static boolean toBoolean(String name) {
        return ((name != null) && name.equalsIgnoreCase("true"));
    }

还有一个很有意思的地方,Boolean的hashCode会选择1231和1237这两个数字?
public int hashCode() {
return value ? 1231 : 1237;
}

我们知道hashCode的目的就是为了提高诸如java.util.HashMap这样的散列表(hash table)的性能.
熟悉HashMap的都知道,HashMap是一种key-value的数据结构,是一种查找表,按照key的hashCode去找对应的value值,hashCode会决定对象在HashMap中的存放位置,以此影响性能,只要保证key的hashCode不重复,就能避免出现hash碰撞的情况,进而保证HashMap性能最优。
根据hashCode散列算法的原则,在一个应用的一次运行期间,equals为true的对象必须返回相同的hashCode,而equals为false的对象不是必须返回不同的hashCode.但是应当让不同的对象返回不同的hashCode.

再来扒一扒JDK的源码,比如String的是这样实现的:

public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;
            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

IntBuffer中是这样实现的:

    public int hashCode() {
        int h = 1;
        int p = position();
        for (int i = limit() - 1; i >= p; i--)
            h = 31 * h + get(i);
        return h;
    }

再比如Array中,其中一个的实现是这样的:

    public static int hashCode(int a[]) {
        if (a == null)
            return 0;
        int result = 1;
        for (int element : a)
            result = 31 * result + element;
        return result;
    }

我们看出,很多计算hashCode的方法,都用了31这样一个素数,我们可以理解为使用素数时,计算的余数越多,这样hashCode散列算法得出的值就越分散,但是hashCode是使用int类型的,如果这个素数太大,就会造成溢出(int的最大值为2的31次方减一),而java语言是老外编写的,按照英文单词的词汇量,使用31这个不大不小的素数基本足够。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值