新聞中心
JDK源碼(jdk 1.5 b2)的研究是一個(gè)很大的范疇,那么今天先對(duì)Java.lang.Boolean開(kāi)始解剖。

創(chuàng)新互聯(lián)10多年企業(yè)網(wǎng)站制作服務(wù);為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì)及高端網(wǎng)站定制服務(wù),企業(yè)網(wǎng)站制作及推廣,對(duì)成都純水機(jī)等多個(gè)方面擁有豐富的網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn)的網(wǎng)站建設(shè)公司。
首先我們來(lái)看JDK源碼中Java.lang.Boolean的代碼,剔除所有的方法和靜態(tài)變量,Java.lang.Boolean的核心代碼如下:
- public final class Boolean implements java.io.Serializable,Comparable
- {
- private final boolean value;
- }
很明顯,凡是成員變量都是final類型的,一定是immutable class,這個(gè)Boolean和String一樣,一旦構(gòu)造函數(shù)執(zhí)行完畢,實(shí)例的狀態(tài)就不能再改變了。
JDK源碼中Java.lang.Boolean的構(gòu)造函數(shù)有兩個(gè):
- public Boolean(boolean value) {
- this.value = value;
- }
- public Boolean(String s) {
- this(toBoolean(s));
- }
都很簡(jiǎn)單就不多說(shuō)了。
另外注重到Java.lang.Boolean類實(shí)際上只有兩種不同狀態(tài)的實(shí)例:一個(gè)包裝true,一個(gè)包裝false,Java.lang.Boolean又是immutable class,所以在內(nèi)存中相同狀態(tài)的Boolean實(shí)例完全可以共享,不必用new創(chuàng)建很多實(shí)例。因此Boolean class還提供兩個(gè)靜態(tài)變量:
- public static final Boolean TRUE = new Boolean(true);
- public static final Boolean FALSE = new Boolean(false);
這兩個(gè)變量在Class Loader裝載時(shí)就被實(shí)例化,并且申明為final,不能再指向其他實(shí)例。
提供這兩個(gè)靜態(tài)變量是為了讓開(kāi)發(fā)者直接使用這兩個(gè)變量而不是每次都new一個(gè)Boolean,這樣既節(jié)省內(nèi)存又避免了創(chuàng)建一個(gè)新實(shí)例的時(shí)間開(kāi)銷。
因此,用
- Boolean b = Boolean.TRUE;
比
- Boolean b = new Boolean(true);
要好得多。
假如碰到下面的情況:
- Boolean b = new Boolean(var);
一定要根據(jù)一個(gè)boolean變量來(lái)創(chuàng)建Boolean實(shí)例怎么辦?
推薦你使用Boolean提供的靜態(tài)工廠方法:
- Boolean b = Boolean.valueOf(var);
這樣就可以避免創(chuàng)建新的實(shí)例,不信看看valueOf()靜態(tài)方法:
- public static Boolean valueOf(boolean b) {
- return (b ? TRUE : FALSE);
- }
這個(gè)靜態(tài)工廠方法返回的仍然是兩個(gè)靜態(tài)變量TRUE和FALSE之一,而不是new一個(gè)Boolean出來(lái)。雖然Java.lang.Boolean非常簡(jiǎn)單,占用的內(nèi)存也很少,但是一個(gè)復(fù)雜的類用new創(chuàng)建實(shí)例的開(kāi)銷可能非常大,而且,使用工廠方法可以方便的實(shí)現(xiàn)緩存實(shí)例,這對(duì)客戶端是透明的。所以,能用工廠方法就不要用new。
和Boolean只有兩種狀態(tài)不同,Integer也是immutable class,但是狀態(tài)上億種,不可能用靜態(tài)實(shí)例緩存所有狀態(tài)。不過(guò),SUN的工程師還是作了一點(diǎn)優(yōu)化,Integer類緩存了-128到127這256個(gè)狀態(tài)的Integer,假如使用Integer.valueOf(int i),傳入的int范圍正好在此內(nèi),就返回靜態(tài)實(shí)例。
hashCode()方法很希奇,兩種Boolean的hash code分別是1231和1237。估計(jì)寫(xiě)B(tài)oolean.java的人對(duì)這兩個(gè)數(shù)字有非凡偏好:
- public int hashCode() {
- return value ? 1231 : 1237;
- }
equals()方法也很簡(jiǎn)單,只有Boolean類型的Object并且value相等才返true:
- public boolean equals(Object obj) {
- if (obj instanceof Boolean) {
- return value == ((Boolean)obj).booleanValue();
- }
- return false;
- }
JDK源碼Java.lang.Boolean的分析就到這里,希望可以在JDK源碼Java.lang.Boolean的基礎(chǔ)上分析其他的代碼,真正掌握J(rèn)DK。
網(wǎng)站標(biāo)題:JDK源碼Java.lang.Boolean的淺析
分享URL:http://m.fisionsoft.com.cn/article/dpsdcij.html


咨詢
建站咨詢
