• Boolean源码解剖学


    原创/朱季谦

    有天突发其想,想看一下Boolean底层都做了些什么,故而去看了一番Boolean的源码,基于一些思考的基础上,输出了这篇文章。

    一.类继承

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

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

    在IDEA生成其类继承图:

    clipboard

    根据以上信息可以得知:

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

    2.Boolean类实现了Comparable接口。

    那么问题来了?

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

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

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

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

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

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

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

    二.类结构

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

    clipboard

    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 TYPE = (Class) 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 }
    4. 1 public Boolean(String s) {
    5. 2 this(parseBoolean(s));
    6. 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则是不吉祥的数字;

  • 相关阅读:
    一篇了解springboot3请求参数种类及接口测试
    【数据可视化】数据可视化入门前的了解
    CSS 圆形的时钟秒针状的手柄绕中心点旋转的效果
    完整指南:如何使用 Node.js 复制文件
    LeetCode 0174. 地下城游戏
    使用OpenCvSharp来计算图像的清晰度(可实现相机自动对焦)
    基于Google Vertex AI 和 Llama 2进行RLHF训练和评估
    软考应该如何备考?
    【无标题】
    torch.bmm功能解读
  • 原文地址:https://blog.csdn.net/weixin_40706420/article/details/134473702