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;
}