Boolean源码解剖学

简介: Boolean源码解析

一.类继承

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);
@SuppressWarnings("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值是比较有意思:

@OverridepublicinthashCode() {
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则是不吉祥的数字;

目录
相关文章
|
算法 测试技术 C#
C++二分查找:统计点对的数目
C++二分查找:统计点对的数目
|
2月前
|
人工智能 测试技术 Shell
Claude Code 用了两周后,我发现它最强的不是写代码
Claude Code 不是普通AI编程助手,它深度融入终端工作流:读项目、跑测试、分析报错、看diff、管提交、记规则(CLAUDE.md)。它不只补代码,而是参与完整工程链路——从需求理解到文档沉淀。真正价值在于“工程化协作”,而非局部辅助。
|
7月前
|
Nacos
 Nacos配置中心
 Nacos配置中心
|
存储 开发者 Docker
|
存储 缓存 Apache
Apache Paimon 在蚂蚁的应用
本文整理自 Apache Paimon Committer 闵文俊老师在5月16日 Streaming Lakehouse Meetup · Online 上的分享。Apache Paimon 是一种实时数据湖格式,设计用于流批一体处理,支持实时更新和OLAP查询。它采用LSM Tree结构,提供多种Changelog Producer和Merge Engine,支持高效的数据合并。Paimon适用于流读、批读及时间旅行查询,与多种查询引擎兼容。在蚂蚁集团的应用中,Paimon降低了资源开销,提升了查询性能,简化了研发流程,特别是在去重、核对场景和离线查询加速方面表现突出。
1771 7
Apache Paimon 在蚂蚁的应用
|
JavaScript Java 测试技术
基于Java的超市管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的超市管理系统的设计与实现(源码+lw+部署文档+讲解等)
388 0
|
运维 网络安全 虚拟化
[运维]ESXI Web Client
[运维]ESXI Web Client
|
算法 安全 Java
你对JVM三色标记的理解嘛?
你对JVM三色标记的理解嘛?
256 0
你对JVM三色标记的理解嘛?
|
SQL 安全 关系型数据库
WEB常见漏洞之SQL注入(靶场篇—2)4
WEB常见漏洞之SQL注入(靶场篇—2)4
313 0
|
Java
JavaFX使用maven-shade-plugin打成Jar包
JavaFX使用maven-shade-plugin打成Jar包
148 0
JavaFX使用maven-shade-plugin打成Jar包