Boolean类源码剖析
一、Boolean类的简介
Boolean
类是基元类型boolean的包装类
,其实例中包含一个boolean类型的字段。此外,此类还提供了许多将boolean转换为String和将String转换为booleana的方法,以及在处理boolean时有用的其他常量和方法。
二、Boolean类的字段
==重点:TRUE与FALSE字段实际上是包装类Boolean缓存思想的体现。==
1 2 3 4 5 6 7 8 9
| 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");
private final boolean value; private static final long serialVersionUID = -3665804199014368530L;
|
因为Boolean实现了Serializable接口,所以支持序列化和反序列化支持。Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常(InvalidCastException)。
Class.getPrimitiveClass
是包私有的方法,因为Class
与Boolean
都属于java.lang
包,因此该方法在Boolean中可以被访问。
注意Boolean.TYPE
、boolean.class
、Boolean.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);
|
三、Boolean类的构造方法
很少适合使用此构造函数。静态工厂方法valueOf(boolean)
通常是更好的选择,因为它具备明显更好的空间和时间性能。如果可能,还可以考虑使用final
字段Boolean.TRUE
和Boolean.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)); }
|
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); }
|
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; }
|
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; }
|
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; }
|