日志

Boolean源码解剖学

 来源    2020-08-01    0  

一.类继承

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

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

在IDEA生成其类继承图:



根据以上信息可以得知:

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

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

那么问题来了?

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

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

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

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

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

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

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


二.类结构

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



Boolean类包含以下属性:

1 public static final Boolean TRUE = new Boolean(true);

public static final Boolean FALSE = new Boolean(false);


@SuppressWarnings("unchecked")
public static final Class<Boolean> TYPE = (Class<Boolean>) Class.getPrimitiveClass("boolean");


private final boolean value;

//用于Java序列化机制,在序列化与反序列过程中,用于判断反序列化文件与该类是否同一版本,若同可反序列化成功。
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) {
    this.value = value;
}
1 public Boolean(String s) {
    this(parseBoolean(s));
}

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

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

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

Boolean的hash值是比较有意思:

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

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

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

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

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

有个有趣的地方是,当

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

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

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

13则是不吉祥的数字;

相关文章
JDK1.7.0_45源码阅读<java.lang.Boolean>
日志本文适合的人群 其实感觉写这个标题的内容没有必要,只要你觉得对你有帮助那么就适合你,对你没帮助那么就不适合你.毕竟我不是专业作者,但咱会尽力的.其实最重要的一点是我不希望浪费您宝贵时间. 简要把内容在 ...
1
linux – cmake源码和源外导航
问答cmake建议使用out-of-source构建.虽然总的来说我喜欢这个想法,但我觉得从源外子目录导航到相应的源目录是不舒服的.我经常需要代码来执行一些代码操作(例如grep,svn命令等). she ...
1
java – Eclipse调试“源码找不到”
问答我刚刚开始使用Eclipse,所以我很容易;).但是当尝试调试一个JUnit测试用例时,我得到一个对话框,指出当我在测试方法中的代码中找到这个行时,找不到源: Assert.assertEquals( ...
Mybatis架构源码分析流程 – 流程图
问答Mybatis架构源码分析,架构图,流程图.::
1
android – SDL 2.0源码有1.3吗?
问答我正在玩SDL 2.0源代码,并注意到其中有另一个声称是1.3版本的SDL文件夹. 我对它感兴趣,因为它有android,iphone和其他一些来源. 稳定版本1.2似乎完全不同. 我的问题是这个, ...
1
VB6下载网页源码
问答在VB6中有没有办法将网页源下载到字符串或文本框?例如在VB.Net中,WebClient类允许你使用.DownloadString("google.com")这样做,我怎样才能在 ...
1
用pip安装一个Python包源码tarball
问答我试图找出如何构建一个可以通过pip安装的Python源码包.我尝试使用http://packages.python.org/an_example_pypi_project/setuptools.ht ...
1
php – Laravel Image Cache比源码慢
问答我正在使用Intervention / imagecache来缓存我的图像. 但是,缓存图像的加载速度比源图像文件慢. 几乎额外的60-70毫秒的时间latancy(测试铬检查元件网络) 这是我在Ro ...
1
如何在IntelliJ 10中附加Android源码?
问答我想将android源代码附加到intellij 10.任何人都知道我该怎么做?::文件>项目结构>模组>依赖关系>双击Android平台>源路径>导航到计算机上的 ...
2
java – 无法使用Intellij Idea社区12.1.4和maven 3.0.5下载源码
问答我在Intellij Idea Community Edition 12.1.4中点击"下载源码和文档",并获得源无法下载的错误. 但是当我尝试: mvn dependency:s ...
1
WPF ComboBox不更新源码
问答我试图让一个WPF组合框工作(在WPFToolkit Datagrid内),我无法正确地将所有的对齐对齐.我正在使用Linq to Entities,并且我将整体数据文本设置为Linq查询的结果: p ...
1
ruby-on-rails – 学习Rails源码入门[已关闭]
问答我最近一直在使用Ruby on Rails进行许多项目,我认为看一下Rails源码真的很有趣,并且真正看到下面是如何运行的.我认为这将是一个伟大的学习经验,可能会增强我的代码Rails应用程序的方式. ...
1
java – Spring源码套件spring3 Hibernate4 maven 3 MySQL 5
问答我的应用程序中出现错误,但我不知道这是什么意思.我在下面贴了一些示例代码.这是我得到的错误: > SEVERE: Exception sending context initialized ev ...
基于Gradle构建一个封闭源码的Android库
问答我想用Gradle构建一个闭源的android库.我的库对开源项目有一些依赖性.我该如何构建我的库?我可以使用gradle吗?::Can I use gradle? 简短回答: 是. 答案很长: 我假 ...
1
JavaScript – 源码映射在Coffeescript – 错误未映射到源
问答我刚刚意识到源映射 – 一个期待已久的功能.我印象深刻的是,许多人聚在一起,使咖啡脚本(浏览器,kickstart项目等) 我设置了一个小测试,所以我可以理解如何使用它- CoffeeScript的 ...
1
如何跳到clojure.lang java源码?
问答当使用苹果酒,做"M-".以上符号"clojure.lang.ISeq"给出错误"没有来源可用于clojure.lang.ISeq". 我看 ...
2
在哪里可以找到Python的hash()函数的源码或算法?
问答>>> hash("\x01") 128000384 >>> hash("\x02") 256000771 >> ...
如何从源码构建Debian/Ubuntu包?
问答我有一个程序的源(取自cvs / svn / git / -),我想为它构建一个Debian / Ubuntu包.该软件包存在于存储库中,但是: >这是一个旧版本(缺乏我需要的功能) >我 ...
2