一.类继承

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

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

在IDEA生成其类继承图:

根据以上信息可以得知:

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

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

那么问题来了?

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

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

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

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

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

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

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

二.类结构

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

Boolean类包含以下属性:

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

说明:

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

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

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

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

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

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

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

Boolean的hash值是比较有意思:

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

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

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

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

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

有个有趣的地方是,当

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

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

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

13则是不吉祥的数字;

Boolean源码解剖学的更多相关文章

  1. java.lang.Boolean 类源码解析

    Boolean源码比较简单. public final class Boolean implements java.io.Serializable, Comparable<Boolean> ...

  2. Java多线程学习之线程池源码详解

    0.使用线程池的必要性 在生产环境中,如果为每个任务分配一个线程,会造成许多问题: 线程生命周期的开销非常高.线程的创建和销毁都要付出代价.比如,线程的创建需要时间,延迟处理请求.如果请求的到达率非常 ...

  3. JDK1.7.0_45源码阅读<java.lang.Boolean>

    本文适合的人群 其实感觉写这个标题的内容没有必要,只要你觉得对你有帮助那么就适合你,对你没帮助那么就不适合你.毕竟我不是专业作者,但咱会尽力的.其实最重要的一点是我不希望浪费您宝贵时间. 简要把内容在 ...

  4. 从JDK源码角度看Boolean

    Java的Boolean类主要作用就是对基本类型boolean进行封装,提供了一些处理boolean类型的方法,比如String类型和boolean类型的转换. 主要实现源码如下: public fi ...

  5. JDK源码之Boolean类分析

    一 简介 boolean类型的封装类,将基本类型为boolean的值包装在一个对象中,实现序列化接口,和Comparable接口 额外提供了许多便捷方法,比较简单,直接贴代码分析 二 源码分析 //t ...

  6. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  7. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  8. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  9. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

随机推荐

  1. 云开发 VSCode 插件 Cloudbase Toolkit 的正确打开方式

    什么是 Cloudbase Toolkit Tencent CloudBase Toolkit 是云开发的 VS Code(Visual Studio Code)插件.该插件可以让您更好地在本地进行云 ...

  2. Kafka入门(1):概述

    摘要 在本文中,我将从为什么需要消息队列开始讲起,举两个小例子,跟你聊聊目前消息队列的一些使用场景. 比如消息队列在复杂系统中的解耦,又比如消息队列在高并发下的场景如果让流量变得更平缓. 随后我会跟你 ...

  3. Hadoop基础(二):从Hadoop框架讨论大数据生态

    1 Hadoop是什么 2 Hadoop三大发行版本 Hadoop三大发行版本:Apache.Cloudera.Hortonworks. Apache版本最原始(最基础)的版本,对于入门学习最好. C ...

  4. shell专题(一):Shell概述

    大数据程序员为什么要学习Shell呢? 1)需要看懂运维人员编写的Shell程序. 2)偶尔会编写一些简单Shell程序来管理集群.提高开发效

  5. 数据可视化之分析篇(七)Power BI数据分析应用:水平分析法

    https://zhuanlan.zhihu.com/p/103264851 首先,以财务报表分析为例,介绍通用的分析方法论,整体架构如下图所示: (点击查看大图) 接下来我会围绕这五种不同的方法论, ...

  6. CentOS开机启动不了修复

    1,如果启动时进度条,先修改为日志启动 启动后快速按任何键(Enter除外)进入如下界面 在按e进入 选择第二个选项卡 在按e进入将红色部分 rhgb quiet 删除,然后按Enter,在按b重启 ...

  7. 【软件安装】CentOS7安装MariaDb(mysql_替代品安装)

    1.背景 Maria Db是流行的跨平台MySQL数据库管理系统的分支,被认为是MySQL 的完全替代品.Maria Db是由Sun在Sun Micro systems合并期间被Oracle收购后,于 ...

  8. Spring-Boot 多数据源配置+动态数据源切换+多数据源事物配置实现主从数据库存储分离

    一.基础介绍 多数据源字面意思,比如说二个数据库,甚至不同类型的数据库.在用SpringBoot开发项目时,随着业务量的扩大,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源. ...

  9. 使用SQL语句进行特定值排序

    使用SQL语句进行查询时,对数据进行排序,排序要求为排序的一个字段中特定值为顶部呈现: select * from TableName order by case TableFieldName whe ...

  10. ~~并发编程(十一):GIL全局解释锁~~

    进击のpython ***** 并发编程--GIL全局解释锁 这小节就是有些"大神"批判python语言不完美之处的开始 这一节我们要了解一下Cpython的GIL解释器锁的工作机 ...