如何解析JDK源碼Java.lang.Boolean的淺析

這篇文章給大家介紹如何解析JDK源碼Java.lang.Boolean的淺析,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

創(chuàng)新互聯(lián)公司致力于網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè),成都網(wǎng)站設(shè)計(jì),集團(tuán)網(wǎng)站建設(shè)等服務(wù)標(biāo)準(zhǔn)化,推過標(biāo)準(zhǔn)化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務(wù)水平進(jìn)行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場競爭中脫穎而出。 選擇創(chuàng)新互聯(lián)公司,就選擇了安全、穩(wěn)定、美觀的網(wǎng)站建設(shè)服務(wù)!

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

首先我們來看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));  }

都很簡單就不多說了。

另外注重到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)變量是為了讓開發(fā)者直接使用這兩個(gè)變量而不是每次都new一個(gè)Boolean,這樣既節(jié)省內(nèi)存又避免了創(chuàng)建一個(gè)新實(shí)例的時(shí)間開銷。

因此,用

Boolean b = Boolean.TRUE;

Boolean b = new Boolean(true);

要好得多。

假如碰到下面的情況:

Boolean b = new Boolean(var);

一定要根據(jù)一個(gè)boolean變量來創(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出來。雖然Java.lang.Boolean非常簡單,占用的內(nèi)存也很少,但是一個(gè)復(fù)雜的類用new創(chuàng)建實(shí)例的開銷可能非常大,而且,使用工廠方法可以方便的實(shí)現(xiàn)緩存實(shí)例,這對客戶端是透明的。所以,能用工廠方法就不要用new。

和Boolean只有兩種狀態(tài)不同,Integer也是immutable class,但是狀態(tài)上億種,不可能用靜態(tài)實(shí)例緩存所有狀態(tài)。不過,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ì)寫B(tài)oolean.java的人對這兩個(gè)數(shù)字有非凡偏好:

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

equals()方法也很簡單,只有Boolean類型的Object并且value相等才返true:

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

關(guān)于如何解析JDK源碼Java.lang.Boolean的淺析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

分享名稱:如何解析JDK源碼Java.lang.Boolean的淺析
URL分享:http://muchs.cn/article18/isjsgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、全網(wǎng)營銷推廣、虛擬主機(jī)、品牌網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)