Boolean类源码剖析

Boolean类源码剖析

一、Boolean类的简介

Boolean类是基元类型boolean的包装类,其实例中包含一个boolean类型的字段。此外,此类还提供了许多将boolean转换为String和将String转换为booleana的方法,以及在处理boolean时有用的其他常量和方法。

image-20230914163010394

二、Boolean类的字段

==重点:TRUE与FALSE字段实际上是包装类Boolean缓存思想的体现。==

1
2
3
4
5
6
7
8
9
// 与基元值true对应的Boolean类型
public static final Boolean TRUE = new Boolean(true);
// 与基元值false对应的Boolean类型
public static final Boolean FALSE = new Boolean(false);
// 基元类型boolean的Class对象
public static final Class<Boolean> TYPE = (Class<Boolean>) Class.getPrimitiveClass("boolean");
// 包装的boolean值
private final boolean value;
private static final long serialVersionUID = -3665804199014368530L;

因为Boolean实现了Serializable接口,所以支持序列化和反序列化支持。Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常(InvalidCastException)。

Class.getPrimitiveClass是包私有的方法,因为ClassBoolean都属于java.lang包,因此该方法在Boolean中可以被访问。

注意Boolean.TYPEboolean.classBoolean.class的区别:

1
2
3
4
5
6
7
8
System.out.println(Boolean.TYPE.getName());
System.out.println(Boolean.class.getName());
System.out.println(boolean.class.getName());
Class<Boolean> booleanClass = Boolean.TYPE;
Class<Boolean> booleanClass1 = boolean.class;
Class<Boolean> booleanClass2 = Boolean.class;
System.out.println(booleanClass == booleanClass1);
System.out.println(booleanClass == booleanClass2);

image-20230914162947944

三、Boolean类的构造方法

很少适合使用此构造函数。静态工厂方法valueOf(boolean)通常是更好的选择,因为它具备明显更好的空间和时间性能。如果可能,还可以考虑使用final字段Boolean.TRUEBoolean.FALSE

1
2
3
4
@Deprecated(since="9")
public Boolean(boolean value) {
this.value = value;
}

如果字符串参数不为null并且在忽略大小写的情况下等于字符串“true”,则分配一个表示值true的Boolean对象。否则,分配一个表示值false的Boolean对象。很少适合使用此构造函数。可以考虑使用parseBoolean(String)方法把字符串转换为boolean基元类型,或者使用valueOf(String)方法把字符串转换为Boolean对象。

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

image-20230914164227240

1
2
3
public static boolean parseBoolean(String s) {
return "true".equalsIgnoreCase(s);
}

四、Boolean类的valueOf方法

该方法返回一个对应于特定boolean值的Boolean对象,根据boolean值的不同返回TRUE或FALSE,该方法避免了创建额外的Boolean对象,使用到了预先定义的Boolean缓存,因此性能更加优异。

1
2
3
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}

image-20230914164954496

1
2
3
public static Boolean valueOf(String s) {
return parseBoolean(s) ? TRUE : FALSE;
}

五、Boolean类的其他方法

booleanValue方法返回Boolean对象表示的基元类型值。

1
2
3
public boolean booleanValue() {
return value;
}

toString方法返回一个String对象,该对象表示指定的布尔值。如果指定的布尔值为true,则将返回字符串“true”,否则将返回字符串“false”。

1
2
3
4
5
6
7
public static String toString(boolean b) {
return b ? "true" : "false";
}

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

hashCode方法返回Boolean对象的哈希值。

1
2
3
4
5
6
7
public int hashCode() {
return Boolean.hashCode(value);
}

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

equals方法比较两个Boolean对象是否相等。

1
2
3
4
5
6
public boolean equals(Object obj) {
if (obj instanceof Boolean) {
return value == ((Boolean)obj).booleanValue();
}
return false;
}

image-20230914165930476

1
2
3
4
5
6
7
8
public static boolean getBoolean(String name) {
boolean result = false;
try {
result = parseBoolean(System.getProperty(name));
} catch (IllegalArgumentException | NullPointerException e) {
}
return result;
}

image-20230914170037644

1
2
3
4
5
6
7
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);
}

以下三个方法是针对boolean值的逻辑操作,很简单:

1
2
3
4
5
6
7
8
9
10
11
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;
}