25

Boolean源码解剖学

 3 years ago
source link: http://www.cnblogs.com/zhujiqian/p/13417083.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一.类继承

Boolean的源码类定义部分如下:

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

在IDEA生成其类继承图:

6veQj2N.png!web

根据以上信息可以得知:

1.Boolean类实现了java.io.Serializable接口,众所周知,这是实现对象序列化的功能。

2.Boolean类实现了Comparable<Boolean>接口。

那么问题来了?

这个Comparable<Boolean>接口是什么东西呢?

看起来是否很眼熟,是否曾在瀚海代码量里偶然一瞥过?

若你在字符串里用过str.compareTo(str2)来做过比较排序话,那你一定多少有点印象,其实Java中的所有compareTo方法都来源于一个共同的祖先,即Comparable接口。

Boolean类同样继承是这个Comparable接口,它的源代码很简单,就只定义了一个方法:

  1 public interface Comparable<T> {
  2     public int compareTo(T o);
  3 }

继承该接口的类,都可通过compareTo方法来对类对象进行排序。该方法将对象与指定对象的顺序做比较,若对象大于、等于或小于指定对象,将分别返回1,0,-1,

推而论之,你也可以由此而明白str.compareTo(str2)底层的继承原理了。

二.类结构

Boolean源码定义了以下的字段与方法,下面将逐一学习分析:

zEr673Z.png!web

Boolean类包含以下属性:

  1 public static final Boolean TRUE = new Boolean(true);
  2 
  3 public static final Boolean FALSE = new Boolean(false);
  4 
  5 
  6 @SuppressWarnings("unchecked")
  7 public static final Class<Boolean> TYPE = (Class<Boolean>) Class.getPrimitiveClass("boolean");
  8 
  9 
 10 private final boolean value;
 11 
 12 //用于Java序列化机制,在序列化与反序列过程中,用于判断反序列化文件与该类是否同一版本,若同可反序列化成功。
 13 private static final long serialVersionUID = -3665804199014368530L;

说明:

1.TRUE与FALSE是Boolean提供的两个静态常量,在用到true或者false时,可直接用这两个常量,无需再耗费资源来创建类似new Boolean(true)这样的新实例;

2.TYPE 基本类型 boolean 的 Class 对象,可用于类反射;

3.value是一个final 定义的私有变量,即

  1 public Boolean(boolean value) {
  2     this.value = value;
  3 }
  1 public Boolean(String s) {
  2     this(parseBoolean(s));
  3 }

第一个比较好理解,那第二个的parseBoolean(s)是什么方法呢?

跟踪进去看,在该方法里,会将String字符串做比较,只有s为“true”时传进去,才会返回一个boolean值。

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

Boolean的hash值是比较有意思:

  1 @Override
  2 public int hashCode() {
  3     return Boolean.hashCode(value);
  4 }

当true时,得到的是1231,当false,得到的是1237。

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

那么,问题来了,为啥Boolean的hash值为什么选择这两个数字呢?

主要原因是,1231与1237是比较大的素数,而选择素数是为了在散列桶中最好地分配数据,其实Boolean也可以选择其他素数作为其哈希值,据说这纯粹是作者的个人喜好。

有个有趣的地方是,当

true: 1231 => 1 + 2 + 3 + 1 = 7;

7-是欧洲传统中的幸运数字;

false: 1237 => 1 + 2 + 3 + 7 = 13;

13则是不吉祥的数字;


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK