Java的Boolean类主要作用就是对基本类型boolean进行封装,提供了一些处理boolean类型的方法,比如String类型和boolean类型的转换。
主要实现源码如下:
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
public final class Boolean implements java.io.Serializable, Comparable<Boolean> {
private final boolean value;
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" );
public Boolean( boolean value) {
this .value = value;
}
public Boolean(String s) {
this (parseBoolean(s));
}
public static boolean parseBoolean(String s) {
return ((s != null ) && s.equalsIgnoreCase( "true" ));
}
public boolean booleanValue() {
return value;
}
public static Boolean valueOf( boolean b) {
return (b ? TRUE : FALSE);
}
public static Boolean valueOf(String s) {
return parseBoolean(s) ? TRUE : FALSE;
}
public static String toString( boolean b) {
return b ? "true" : "false" ;
}
public String toString() {
return value ? "true" : "false" ;
}
public int hashCode() {
return Boolean.hashCode(value);
}
public static int hashCode( boolean value) {
return value ? 1231 : 1237 ;
}
public boolean equals(Object obj) {
if (obj instanceof Boolean) {
return value == ((Boolean) obj).booleanValue();
}
return 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 );
}
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;
}
}
|
既然是对基本类型boolean的封装,那必然要有一个变量来保存,即value,而且它被声明为final,表明它是不可变的。两种构造函数可分别传入boolean和String类型,对于String类型会进行”to boolean”解析,即当传入的字符串忽略大小写等于”true”时判断为true,否则为false。
但是我们说一般不推荐直接用构造函数来实例化Boolean对象,这是为什么?接着往下看,对于布尔值也就只有两种状态,我们其实可以仅仅用两个对象就表示所有的布尔值,也就是说在Java的世界中只要全局存在两个Boolean对象即可,实例化出多余的Boolean对象仍然能正确表示布尔值,只是会浪费一些空间和影响时间性能。仅需要的两个对象为,
[Java] 纯文本查看 复制代码
1
2
|
public static final Boolean TRUE = new Boolean( true );
public static final Boolean FALSE = new Boolean( false );
|
所以推荐的形式是Boolean.TRUE或Boolean.valueOf(true)或Boolean.valueOf("true"),避免生成不必要的对象。
接着再看看Boolean的TYPE属性,它toString的值其实是boolean。
[Java] 纯文本查看 复制代码
1
|
public static final Class<Boolean> TYPE = (Class<Boolean>) Class.getPrimitiveClass( "boolean" );
|
看看怎么来的。Class的getPrimitiveClass是一个native方法,在Class.c中有个Java_java_lang_Class_getPrimitiveClass方法与之对应,所以JVM层面会通过JVM_FindPrimitiveClass函数会根据”boolean”字符串获得jclass,最终到Java层则为Class<Boolean>。
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
Java_java_lang_Class_getPrimitiveClass(JNIEnv *env,
jclass cls,
jstring name)
{
const char *utfName;
jclass result;
if (name == NULL) {
JNU_ThrowNullPointerException(env, 0 );
return NULL;
}
utfName = (*env)->GetStringUTFChars(env, name, 0 );
if (utfName == 0 )
return NULL;
result = JVM_FindPrimitiveClass(env, utfName);
(*env)->ReleaseStringUTFChars(env, name, utfName);
return result;
}
|
当TYPE执行toString时,逻辑如下,则其实是getName函数决定其值,getName通过native方法getName0从JVM层获取名称,
[Java] 纯文本查看 复制代码
1
2
3
4
|
public String toString() {
return (isInterface() ? "interface " : (isPrimitive() ? "" : "class " ))
+ getName();
}
|
getName0根据一个数组获得对应的名称,JVM根据Java层的Class可得到对应类型的数组下标,比如这里下标为4,则名称为”boolean”。
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
const char * type2name_tab[T_CONFLICT+ 1 ] = {
NULL, NULL, NULL, NULL,
"boolean" ,
"char" ,
"float" ,
"double" ,
"byte" ,
"short" ,
"int" ,
"long" ,
"object" ,
"array" ,
"void" ,
"*address*" ,
"*narrowoop*" ,
"*conflict*"
};
|
往下继续看HashCode,实现逻辑如下,即true返回1231而false返回1237。
[Java] 纯文本查看 复制代码
1
2
3
|
public static int hashCode( boolean value) {
return value ? 1231 : 1237 ;
}
|
equals方法就是先判断是不是从Boolean实例化出来的,然后再继续比较是不是相等。
实现Comparable<Boolean>接口是为了方便在集合中进行比较,它需要实现的方法为compareTo。
此外,还提供了logicalAnd、logicalOr和logicalXor用于实现三种逻辑运算。
更多学习资料可关注gzitcast获取(weiixn)