Boolean源码解剖学

栏目: IT技术 · 发布时间: 4年前

内容简介:一.类继承Boolean的源码类定义部分如下:在IDEA生成其类继承图:

一.类继承

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

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

在IDEA生成其类继承图:

Boolean源码解剖学

根据以上信息可以得知:

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源码定义了以下的字段与方法,下面将逐一学习分析:

Boolean源码解剖学

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则是不吉祥的数字;


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

人月神话(英文版)

人月神话(英文版)

[美] Frederick P. Brooks, Jr. / 人民邮电出版社 / 2010-8 / 29.00元

本书内容源于作者Brooks在IBM公司任System/360计算机系列以及其庞大的软件系统OS/360项目经理时的实践经验。在本书中,Brooks为人们管理复杂项目提供了最具洞察力的见解,既有很多发人深省的观点,又有大量软件工程的实践,为每个复杂项目的管理者给出了自己的真知灼见。 大型编程项目深受由于人力划分产生的管理问题的困扰,保持产品本身的概念完整性是一个至关重要的需求。本书探索了达成......一起来看看 《人月神话(英文版)》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具