一.类继承
Boolean的源码类定义部分如下:
publicfinalclassBooleanimplementsjava.io.Serializable, Comparable<Boolean>
在IDEA生成其类继承图:
根据以上信息可以得知:
1.Boolean类实现了java.io.Serializable接口,众所周知,这是实现对象序列化的功能。
2.Boolean类实现了Comparable<Boolean>接口。
那么问题来了?
这个Comparable<Boolean>接口是什么东西呢?
看起来是否很眼熟,是否曾在瀚海代码量里偶然一瞥过?
若你在字符串里用过str.compareTo(str2)来做过比较排序话,那你一定多少有点印象,其实Java中的所有compareTo方法都来源于一个共同的祖先,即Comparable接口。
Boolean类同样继承是这个Comparable接口,它的源代码很简单,就只定义了一个方法:
publicinterfaceComparable<T> { publicintcompareTo(To); }
继承该接口的类,都可通过compareTo方法来对类对象进行排序。该方法将对象与指定对象的顺序做比较,若对象大于、等于或小于指定对象,将分别返回1,0,-1,
推而论之,你也可以由此而明白str.compareTo(str2)底层的继承原理了。
二.类结构
Boolean源码定义了以下的字段与方法,下面将逐一学习分析:
Boolean类包含以下属性:
publicstaticfinalBooleanTRUE=newBoolean(true); publicstaticfinalBooleanFALSE=newBoolean(false); "unchecked") (publicstaticfinalClass<Boolean>TYPE= (Class<Boolean>) Class.getPrimitiveClass("boolean"); privatefinalbooleanvalue; //用于Java序列化机制,在序列化与反序列过程中,用于判断反序列化文件与该类是否同一版本,若同可反序列化成功。privatestaticfinallongserialVersionUID=-3665804199014368530L;
说明:
1.TRUE与FALSE是Boolean提供的两个静态常量,在用到true或者false时,可直接用这两个常量,无需再耗费资源来创建类似new Boolean(true)这样的新实例;
2.TYPE 基本类型 boolean 的 Class 对象,可用于类反射;
3.value是一个final 定义的私有变量,即
publicBoolean(booleanvalue) { this.value=value; } publicBoolean(Strings) { this(parseBoolean(s)); }
第一个比较好理解,那第二个的parseBoolean(s)是什么方法呢?
跟踪进去看,在该方法里,会将String字符串做比较,只有s为“true”时传进去,才会返回一个boolean值。
publicstaticbooleanparseBoolean(Strings) { return ((s!=null) &&s.equalsIgnoreCase("true")); }
Boolean的hash值是比较有意思:
publicinthashCode() { returnBoolean.hashCode(value); }
当true时,得到的是1231,当false,得到的是1237。
publicstaticinthashCode(booleanvalue) { returnvalue?1231 : 1237; }
那么,问题来了,为啥Boolean的hash值为什么选择这两个数字呢?
主要原因是,1231与1237是比较大的素数,而选择素数是为了在散列桶中最好地分配数据,其实Boolean也可以选择其他素数作为其哈希值,据说这纯粹是作者的个人喜好。
有个有趣的地方是,当
true: 1231 => 1 + 2 + 3 + 1 = 7;
7-是欧洲传统中的幸运数字;
false: 1237 => 1 + 2 + 3 + 7 = 13;
13则是不吉祥的数字;