Java語法糖系列二:自動裝箱/拆箱和條件編譯

目錄:
Java語法糖系列一:可變長度參數(shù)和foreach循環(huán)
http://www.reibang.com/p/628568f94ef8

Java語法糖系列二:自動裝箱/拆箱和條件編譯
http://www.reibang.com/p/946b3c4a5db6

Java語法糖系列三:泛型與類型擦除
http://www.reibang.com/p/4de08deb6ba4

Java語法糖系列四:枚舉類型
http://www.reibang.com/p/ae09363fe734

Java語法糖系列五:內(nèi)部類和閉包
http://www.reibang.com/p/f55b11a4cec2


上一篇寫到可變長參數(shù)和foreach循環(huán),這篇討論下java的自動裝箱/拆箱和條件編譯這兩個語法糖。

自動裝箱/拆箱

自動拆箱/裝箱是在編譯期驯绎,依據(jù)代碼的語法肌蜻,決定是否進(jìn)行拆箱和裝箱動作黎泣。

裝箱過程:把基本類型用它們對應(yīng)的包裝類型進(jìn)行包裝,使基本類型具有對象特征腰素。

拆箱過程:與裝箱過程相反聘裁,把包裝類型轉(zhuǎn)換成基本類型。

public static void main(String[] args){
    int i=1;
    Integer a = 1;
    Integer b = 1;
    Long c = 1L;
    System.out.println(a == b);
    System.out.println(a.equals(i));
    System.out.println(c.equals(a));
 }

結(jié)果是

 true
 true
 false

編譯出來的代碼如下

public static void main(String[] paramArrayOfString)
  {
      int i = 1;
       Integer localInteger1 = Integer.valueOf(1);
    Integer localInteger2 = Integer.valueOf(1);
       Long localLong = Long.valueOf(1L);
    System.out.println(localInteger1 == localInteger2);
       System.out.println(localInteger1.equals(Integer.valueOf(i)));
       System.out.println(localLong.equals(localInteger1));
  }

可以看到在自動裝箱的時候弓千,Java虛擬機(jī)會自動調(diào)用Integer的valueOf方法衡便;
在自動拆箱的時候,Java虛擬機(jī)會自動調(diào)用Integer的intValue方法洋访。這就是自動拆箱和自動裝箱的原理镣陕。

注:上述例子的代碼應(yīng)該盡量避免自動拆箱與裝箱。

條件編譯

很多編程語言都提供了條件編譯的途徑姻政,C呆抑,C++中使用#ifdef。
看如下C代碼汁展,在debug模式編譯代碼塊1鹊碍,其他編譯代碼塊2

#define DEBUG  
#IFDEF DEBUUG  
  /* 
   code block 1 
   */   
#ELSE  
  /* 
   code block 2 
  */  
#ENDIF  

Java語言并沒有提供這種預(yù)編譯功能,但是Java也能實(shí)現(xiàn)預(yù)編譯食绿。
源代碼

public static void main(String[] args){
    // TODO Auto-generated method stub
    if(true){  
        System.out.println("true");  
    }else{  
        System.out.println("false");  
    }  
}

編譯后的代碼

 public static void main(String[] paramArrayOfString)
  {
        System.out.println("true");
  }

可以看到編譯器會對代碼進(jìn)行優(yōu)化侈咕,對于條件永遠(yuǎn)為false的語句,JAVA編譯器將不會對其生成字節(jié)碼器紧。這一動作發(fā)生在編譯器解除語法糖階段耀销。所以說,可以利用條件語句來實(shí)現(xiàn)預(yù)編譯铲汪。

至于運(yùn)用當(dāng)然是在bebug模式下打log啦

public static void main(String[] args){
    // TODO Auto-generated method stub
    boolean DEBUG=true;
    if(DEBUG) {  
        log.info("Syntactic Sugar熊尉!");  
    }  
}

一點(diǎn)拓展

看如下代碼

public static void main(String[] args){
    // TODO Auto-generated method stub
         Integer i1 = 127;
        Integer i2 = 127;
        Integer i3 = 128;
        Integer i4 = 128;
 
        System.out.println(i1 == i2);
        System.out.println(i3 == i4);
    
        Double d1 = 127.0;
        Double d2 = 127.0;
        Double d3 = 128.0;
        Double d4 = 128.0;
 
        System.out.println(d1 == d2);
        System.out.println(d3 == d4);
}

結(jié)果是

true
false
false
false

產(chǎn)生這樣的結(jié)果的原因是:Byte、Short掌腰、Integer狰住、Long、Char這幾個裝箱類的valueOf()方法是以128位分界線做了緩存的齿梁,假如是[-128,127]區(qū)間的值是會取緩存里面的引用的转晰,以Integer為例,其valueOf(int i)的源代碼為:

static final int low = -128;
static final int high=127;

 public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

而Float士飒、Double不會的原因也很簡單查邢,因?yàn)閎yte、Short酵幕、integer扰藕、long、char在某個范圍內(nèi)的整數(shù)個數(shù)是有限的芳撒,但是float邓深、double這兩個浮點(diǎn)數(shù)卻不是未桥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市芥备,隨后出現(xiàn)的幾起案子冬耿,更是在濱河造成了極大的恐慌,老刑警劉巖萌壳,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亦镶,死亡現(xiàn)場離奇詭異,居然都是意外死亡袱瓮,警方通過查閱死者的電腦和手機(jī)缤骨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尺借,“玉大人绊起,你說我怎么就攤上這事×钦叮” “怎么了虱歪?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長栅表。 經(jīng)常有香客問我笋鄙,道長,這世上最難降的妖魔是什么谨读? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮坛吁,結(jié)果婚禮上劳殖,老公的妹妹穿的比我還像新娘。我一直安慰自己拨脉,他們只是感情好哆姻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著玫膀,像睡著了一般矛缨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上帖旨,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天箕昭,我揣著相機(jī)與錄音,去河邊找鬼解阅。 笑死落竹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的货抄。 我是一名探鬼主播述召,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼朱转,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了积暖?” 一聲冷哼從身側(cè)響起藤为,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夺刑,沒想到半個月后缅疟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡性誉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年窿吩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片错览。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡纫雁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出倾哺,到底是詐尸還是另有隱情轧邪,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布羞海,位于F島的核電站忌愚,受9級特大地震影響矗漾,放射性物質(zhì)發(fā)生泄漏厨喂。R本人自食惡果不足惜膳殷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一茅姜、第九天 我趴在偏房一處隱蔽的房頂上張望击孩。 院中可真熱鬧移怯,春花似錦硕勿、人聲如沸替梨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至民傻,卻和暖如春胰默,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背漓踢。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工牵署, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喧半。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓碟刺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親薯酝。 傳聞我的和親對象是個殘疾皇子半沽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 自動裝箱和拆箱從Java1.5開始引入爽柒,目的是將原始類型值轉(zhuǎn)自動地轉(zhuǎn)換成對應(yīng)的對象。自動裝箱與拆箱的機(jī)制可以讓我們...
    GB_speak閱讀 619評論 0 4
  • 深入理解Java中的包裝類與自動拆裝箱 文章出處:安卓進(jìn)階學(xué)習(xí)指南 作者:麥田哥(Whea...
    wheat7閱讀 2,617評論 2 11
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,842評論 25 707
  • 最近聽到了羅胖在羅輯思維里2016年的跨年演講《時間的朋友》時所提到的關(guān)于人工智能的全新認(rèn)識者填,使我這個對人...
    清風(fēng)過影堂閱讀 697評論 0 0
  • 創(chuàng)建一個社交網(wǎng)站 重點(diǎn): 使用認(rèn)證(authentication)框架 創(chuàng)建用戶注冊視圖(views) 通過一個定...
    StewieK閱讀 404評論 0 0