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

目录
相关文章
|
Python
解决安装ConcurrentLogHandler报错error in ConcurrentLogHandler setup command: use_2to3 is invalid.
本文介绍了在Python环境下安装ConcurrentLogHandler时遇到的"use_2to3 is invalid"错误的解决方法,主要是通过降级setuptools到57.5.0版本来解决该问题。
647 2
|
消息中间件 中间件 Kafka
Kafka - TimeoutException: Expiring 1 record(s) for art-0:120001 ms has passed since batch creation
Kafka - TimeoutException: Expiring 1 record(s) for art-0:120001 ms has passed since batch creation
1524 0
|
域名解析
超简单 图解 三级域名解析
超简单 图解 三级域名解析 最近自己在玩 搭建 ngrok 内网穿透,用到了三级域名解析,类似:blog.ngrok.xxx.com 查了下,发现这类的教程非常少,于是,我来造福你们了 下面开始 一、添加二级域名解析 主机记录填写你要使用的二级域名,我填的ngrok, 记录值填你服务器的IP地址 二、添加三级域名解析 主机记录填写 你要用的(三级域名.二级域名)我这里是泛解析,用了*.ngrok,你可以泛解析到你的二级域名,记录值填写你刚刚添加的二级域名。
12974 3
|
缓存
IDEA 卡住不动的解决办法,超级管用。。。
IDEA 卡住不动的解决办法,超级管用。。。
2695 0
IDEA 卡住不动的解决办法,超级管用。。。
|
XML Java 数据格式
|
5月前
|
JSON API PHP
全球天气预报5天(经纬度版)免费API接口教程
本文介绍接口盒子提供的全球天气预报API,支持通过经纬度获取任意地区未来5天的详细天气数据,包含温度、气压、湿度、风速等12项气象要素。提供每3小时的精细化预报,个人开发者可免费调用(需注册获取KEY)。附请求参数、返回数据说明及PHP、Python调用示例,适用于气象平台、出行类APP、物联网监测等场景。
|
12月前
|
算法 NoSQL Java
微服务架构下的接口限流策略与实践#### 一、
本文旨在探讨微服务架构下,面对高并发请求时如何有效实施接口限流策略,以保障系统稳定性和服务质量。不同于传统的摘要概述,本文将从实际应用场景出发,深入剖析几种主流的限流算法(如令牌桶、漏桶及固定窗口计数器等),通过对比分析它们的优缺点,并结合具体案例,展示如何在Spring Cloud Gateway中集成自定义限流方案,实现动态限流规则调整,为读者提供一套可落地的实践指南。 #### 二、
346 3
|
存储 开发者 Docker
|
监控 NoSQL 大数据
【MongoDB复制集瓶颈】高频大数据写入引发的灾难,如何破局?
【8月更文挑战第24天】在MongoDB复制集中,主节点处理所有写请求,从节点通过复制保持数据一致性。但在大量高频数据插入场景中,会出现数据延迟增加、系统资源过度消耗、复制队列积压及从节点性能不足等问题,影响集群性能与稳定性。本文分析这些问题,并提出包括优化写入操作、调整写入关注级别、采用分片技术、提升从节点性能以及持续监控调优在内的解决方案,以确保MongoDB复制集高效稳定运行。
453 2
|
搜索推荐 关系型数据库 MySQL
mysql like查询优化
通过合理的索引设计、使用全文索引、优化查询结构以及考虑分片和分区表,可以显著提高MySQL中 `LIKE`查询的性能。针对不同的应用场景选择合适的优化策略,能够有效地提升数据库查询效率,减少查询时间。希望这些方法和技巧能帮助您优化MySQL数据库中的模糊查询。
1295 4