国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

JDK源碼分析:java.lang.Boolean

2019-11-18 14:49:11
字體:
供稿:網(wǎng)友

閑來無事,開始研究JDK源碼(jdk 1.5 b2),先找了一個(gè)最簡(jiǎn)單的java.lang.Boolean開始解剖。

由于水平有限,難免有不少錯(cuò)誤,還請(qǐng)大家指正!

首先我們剔除所有的方法和靜態(tài)變量,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)就不能再改變了。

Boolean的構(gòu)造函數(shù)有兩個(gè):

public Boolean(boolean value) {
    this.value = value;
}
public Boolean(String s) {
    this(toBoolean(s));
}

都很簡(jiǎn)單就不多說了。

另外注重到Boolean類實(shí)際上只有兩種不同狀態(tài)的實(shí)例:一個(gè)包裝true,一個(gè)包裝false,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出來。雖然Boolean非常簡(jiǎn)單,占用的內(nèi)存也很少,但是一個(gè)復(fù)雜的類用new創(chuàng)建實(shí)例的開銷可能非常大,而且,使用工廠方法可以方便的實(shí)現(xiàn)緩存實(shí)例,這對(duì)客戶端是透明的。所以,能用工廠方法就不要用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的人對(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;
}



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 沈阳市| 时尚| 亳州市| 信丰县| 通化县| 楚雄市| 日土县| 临夏市| 穆棱市| 米林县| 桂平市| 新竹市| 楚雄市| 瓦房店市| 普兰店市| 胶州市| 宜兰县| 论坛| 东乡县| 凌源市| 大宁县| 博兴县| 合水县| 南皮县| 潼南县| 桓仁| 郧西县| 阿拉善右旗| 宁蒗| 同心县| 迭部县| 调兵山市| 泰安市| 通辽市| 承德市| 丹寨县| 鱼台县| 黎城县| 乐安县| 贡嘎县| 福贡县|