JDK源码之Boolean类分析

一 简介

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

二 源码分析

    //true 和 false值的包装类实例
    public static final Boolean TRUE = new Boolean(true);

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

    // Boolean类的class实例
    @SuppressWarnings("unchecked")
    public static final Class<Boolean> TYPE = (Class<Boolean>) Class.getPrimitiveClass("boolean");//调用的native方法

    // 此包装类的值
    private final boolean value;

    private static final long serialVersionUID = -3665804199014368530L;

    //两个jdk9之后废弃的构造器,官方推荐使用 valueOf方法
    @Deprecated(since="9")
    public Boolean(boolean value) {
        this.value = value;
    }

    @Deprecated(since="9")
    public Boolean(String s) {
        this(parseBoolean(s));
    }

    //只有传 'true' 返回true,其他都是false
    public static boolean parseBoolean(String s) {
        return "true".equalsIgnoreCase(s);
    }

    //返回基本boolean类型值
    @HotSpotIntrinsicCandidate
    public boolean booleanValue() {
        return value;
    }

    // 根据参数返回Boolean对象实例
    @HotSpotIntrinsicCandidate
    public static Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);
    }

    // 只有 "true" 为 true,其他全是false
    public static Boolean valueOf(String s) {
        return parseBoolean(s) ? TRUE : FALSE;
    }

    //返回boolean类型参数的字符串
    public static String toString(boolean b) {
        return b ? "true" : "false";
    }

    // 返回此对象的值的字符串形式
    public String toString() {
        return value ? "true" : "false";
    }

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

    /**
     * hashCode,静态
     * 真1231,假1237。这两个数是比较大的质数,也就是素数。
     * 1.素数。假如将Boolean放入一个HashTable中,那么这两个数的共同因子就比较少,在求取hash时,那么出现相同hash值的概率就比较小。
     * 2.为何选择如此大的素数。为什么不是2和3呢。如果选择了较小的素数,那么在求取hash的时候,可能出现分布不均的情况。
     * 总之,就是为了在进行hash操作是尽量不冲突,并均匀。
     */
    public static int hashCode(boolean value) {
        return value ? 1231 : 1237;
    }

    // 只有参数是Boolean类型,并且value相等,返回true,否则都是false
    public boolean equals(Object obj) {
        if (obj instanceof Boolean) {
            return value == ((Boolean)obj).booleanValue();
        }
        return false;
    }

    /**
     *  当且仅当以参数命名的系统属性存在,且等于 “true” 字符串时,才返回 true
     *  比如设置了某个系统属性:  System.setProperty(s1,"true");  则改方法返回true
     */
    public static boolean getBoolean(String name) {
        boolean result = false;
        try {
            result = parseBoolean(System.getProperty(name));
        } catch (IllegalArgumentException | NullPointerException e) {
        }
        return result;
    }

    //比较大小,   true > false
    public int compareTo(Boolean b) {
        return compare(this.value, b.value);
    }

    public static int compare(boolean x, boolean y) {
        return (x == y) ? 0 : (x ? 1 : -1);
    }

    /**
     * 三个jdk1.8新增逻辑运算接口
     */
    //求与
    public static boolean logicalAnd(boolean a, boolean b) {
        return a && b;
    }
    // 或
    public static boolean logicalOr(boolean a, boolean b) {
        return a || b;
    }
    //按位异或,二进制位相同则结果为0,不同则结果为1
    public static boolean logicalXor(boolean a, boolean b) {
        return a ^ b;
    }
posted @ 2020-01-13 14:59  侯小厨  阅读(263)  评论(0编辑  收藏  举报
Fork me on Gitee