Boolean

      Boolean是java基本数据类型中boolean的包装类,它只有false和true两种值,现在我们一起去看看它的实现吧^_^

类图

Boolean.png

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

      通过类图和源码我们可以知道Boolean类型可序列化,并且实例化对象是可以进行比较的,由于final修饰,所以Boolean是无法被继承的。

成员变量

public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
public static final Class<Boolean> TYPE = (Class<Boolean>) Class.getPrimitiveClass("boolean");//基本类型 boolean 的 Class 对象
private final boolean value;

      Boolean类有两个常量:TRUE和FALSE,分别表示true与false。Boolean类将值存储在基本数据类型boolean(value)中,使用final修饰,说明Boolean的值是不可变的。在这点上和Integer一致。

构造方法

public Boolean(boolean value) {
    this.value = value;
}
public Boolean(String s) {
    this(parseBoolean(s));
}

      Boolean类没有无参构造方法,我们可以通过传递boolean类型和字符串new实例。根据源码中的Note我们了解到官方不推荐使用形如Boolean instance = new Boolean(true);这个构造方法来获取实例对象(除非确实需要一个新的实例对象),推荐使用静态方法valueOf(true)来获取实例对象,它具有更好的空间和时间性能。

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

//来自String类
public boolean equalsIgnoreCase(String anotherString) {
    return (this == anotherString) ? true
            : (anotherString != null)
            && (anotherString.value.length == value.length)
            && regionMatches(true, 0, anotherString, 0, value.length);
}

      第二个构造方法传递一个字符串,判断字符串是否等于“true”,如果相等则返回true,否则返回false。

booleanValue

public boolean booleanValue() {
    return value;
}

      直接返回成员变量value的值。

valueOf

public static Boolean valueOf(boolean b) {    
    return (b ? TRUE : FALSE);
}
public static Boolean valueOf(String s) {
    return parseBoolean(s) ? TRUE : FALSE;
}

      静态方法,通过传递基本数据类型(或者字符串)返回TRUE或FALSE,由于TRUE和FALSE是静态常量,所以仅此一份,每次调用valueOf方法并不会创建新的实例对象,带来了更好的空间和时间性能,所以官方推荐使用此方法类获取实例对象。

Boolean t1 = Boolean.valueOf(true);
Boolean t2 = Boolean.valueOf(true);
Boolean t3 = new Boolean(true);
System.out.println(t1 == t2);//true
System.out.println(t1 == t3);//false

      通过如上的测试用例我们也看发现使用valueOf获取的实例对象是同一个,而使用new Boolean(value)方法获取的是一个全新的实例对象。注:包装类型的比较还是推荐使用equals哦,否则可能会导致不必要的错误。

toString

public static String toString(boolean b) {
    return b ? "true" : "false";
}
public String toString() {
    return value ? "true" : "false";
}

      Boolean用两个toString方法,一个为静态方法,它接受一个boolean类型,输出相应的字符串,另一个为重写方法,它将根据value的值输出相应的字符串。

hashCode

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

      Boolean的hashCode只返回两个值,true对应1231,false对应1237为什么是这两个值呢?因为这是两个较大的质数,其实其他两个大的质数也行的,仅仅是该程序员喜欢罢了!

equals

public boolean equals(Object obj) {
    if (obj instanceof Boolean) {
        return value == ((Boolean)obj).booleanValue();
    }
    return false;
}

      首先判断是不是Boolean类型的实例,不是直接返回false,否则判断value的值是否等于接收的obj的值(两个value是否相等)。

getBoolean

public static boolean getBoolean(String name) {
    boolean result = false;
    try {
        result = parseBoolean(System.getProperty(name));
    } catch (IllegalArgumentException | NullPointerException e) {
    }
    return result;
}

      此方法在当且仅当name所表示的系统属性存在并且等于“true”时返回true,否则返回false。

String name = "hcp.jdk";
//name为不存在的系统属性时
System.out.println(Boolean.getBoolean(name));//false
//通过-Dhcp.jdk=true设置虚拟机参数
System.out.println(Boolean.getBoolean(name));//true

compareTo

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

      当两对象值相同时返回0,否则,如果this的值为true(说明另一个为false)返回1,否则返回false。(Boolean的规则就是true > false)

与\或\异或

public static boolean logicalAnd(boolean a, boolean b) {
    return a && b;
}
public static boolean logicalOr(boolean a, boolean b) {
    return a || b;
}
public static boolean logicalXor(boolean a, boolean b) {
    return a ^ b;
}

      与我们一般的规律没有区别呢。

System.out.println(Boolean.logicalAnd(true,true));//true
System.out.println(Boolean.logicalAnd(true,false));//false
System.out.println(Boolean.logicalOr(true,true));//true
System.out.println(Boolean.logicalOr(true,false));//true
System.out.println(Boolean.logicalXor(true,true));//false
System.out.println(Boolean.logicalXor(true,false));//true
Last modification:September 2nd, 2019 at 07:43 pm
如果觉得我的文章对你有用,请随意赞赏