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