我的蛋殼

          倡導(dǎo)自由、開放、分享的Java技術(shù)社區(qū) http://www.javaread.com

           

          新發(fā)現(xiàn),大家都來試試看,有沒有猜對結(jié)果

           1 public class AutoBoxingTester {        
           2 public static void judgeEqual(Integer i, Integer j) 
           3 {        
           4 if (i == j) {            
           5 System.out.println("Equal!");        
           6 else {            
           7 System.out.println("Not Equal!");        
           8 }    
           9 }     
          10 public static void main(String[] args){        
          11 Integer i = 100;        
          12 Integer j = 100;        
          13 judgeEqual(i, j);                
          14 Integer a = 255;        
          15 Integer b = 255;        
          16 judgeEqual(a, b);    
          17 
          18 }


          結(jié)果是怎樣呢?兩個(gè)"Equal"?或者兩個(gè)"Not Equal"?猜對了沒有?
          嘿嘿,大家跑一跑的話,可能就會覺得很奇怪了。

           

          答案就先不貼出來,大家先猜一猜,免得破壞興致。
          欲知答案以及分析詳見:
          AutoBoxing與Unboxing細(xì)節(jié)分析

          本文作者:javaread.com

          posted on 2008-08-19 17:49 javaread.com 閱讀(1850) 評論(14)  編輯  收藏

          評論

          # re: 新發(fā)現(xiàn),大家都來試試看,有沒有猜對結(jié)果 2008-08-19 18:13 小笨笨

          好像是2個(gè) 相等吧  回復(fù)  更多評論   

          # re: 新發(fā)現(xiàn),大家都來試試看,有沒有猜對結(jié)果 2008-08-19 18:15 KTOO

          去試了下,發(fā)現(xiàn)-128到127間的Integer是Equal,其它的就成了Not Equal了  回復(fù)  更多評論   

          # re: 新發(fā)現(xiàn),大家都來試試看,有沒有猜對結(jié)果 2008-08-19 18:25

          所以,不要使用==,而是使用Equals來判斷啦

          除了對基本數(shù)據(jù)類型,==從來是判斷指針的
            回復(fù)  更多評論   

          # re: 新發(fā)現(xiàn),大家都來試試看,有沒有猜對結(jié)果 2008-08-19 18:29 bjsuo

          因?yàn)镮nteger對象把-128到127之間的數(shù)字預(yù)定義成了靜態(tài)變量,所以每當(dāng)生成這個(gè)區(qū)間的數(shù)字的時(shí)候,實(shí)際上直接返回了預(yù)生成的對象,所以
          Integer i = 100;
          Integer j = 100; 實(shí)際上i和j是指向的同一個(gè)對象而
          Integer i = 255;
          Integer j = 255; 是生成了兩個(gè)不同的對象,比較引用是不等的  回復(fù)  更多評論   

          # re: 新發(fā)現(xiàn),大家都來試試看,有沒有猜對結(jié)果[未登錄] 2008-08-19 18:46 ytl

          第一個(gè)不相等第2個(gè)相等  回復(fù)  更多評論   

          # re: 新發(fā)現(xiàn),大家都來試試看,有沒有猜對結(jié)果 2008-08-19 21:11 Hatter Jiang

          這個(gè)和JAVA的常量池有關(guān)系,有舉的同學(xué)可以去google一下JAVA的常量池的信息  回復(fù)  更多評論   

          # re: 新發(fā)現(xiàn),大家都來試試看,有沒有猜對結(jié)果 2008-08-19 23:13 隔葉黃鶯

          Integer i = 100;

          編譯之后實(shí)際的操作是
          Integer i = Integer.valueOf(100);

          再看 valuesOf() 方法就能知道,對于-128到127之間的數(shù)字是從緩存中取的,所以==。

          所以拆箱裝箱是編譯器的行為,而非 JVM 的行為。  回復(fù)  更多評論   

          # re: 新發(fā)現(xiàn),大家都來試試看,有沒有猜對結(jié)果 2008-08-20 00:00 xbloom

          jdk source:
          public static Integer valueOf(int i) {
          final int offset = 128;
          if (i >= -128 && i <= 127) { // must cache
          return IntegerCache.cache[i + offset];
          }
          return new Integer(i);
          }  回復(fù)  更多評論   

          # re: 新發(fā)現(xiàn),大家都來試試看,有沒有猜對結(jié)果 2008-08-20 00:27 黑蝙蝠

          原來是這樣~~~ i == j 的時(shí)候會調(diào)用valueOf嗎?  回復(fù)  更多評論   

          # re: 新發(fā)現(xiàn),大家都來試試看,有沒有猜對結(jié)果 2008-08-20 00:49 隔葉黃鶯

          i == j
          就是比較,是最基本的操作,不會跑去調(diào)用 valueOf()的  回復(fù)  更多評論   

          # re: 新發(fā)現(xiàn),大家都來試試看,有沒有猜對結(jié)果 2008-08-20 12:35 aaronhe

          Integer i = 100; 這個(gè)能編譯通過?  回復(fù)  更多評論   

          # re: 新發(fā)現(xiàn),大家都來試試看,有沒有猜對結(jié)果 2008-08-20 13:15 々上善若水々

          樓上火星人.  回復(fù)  更多評論   

          # re: 新發(fā)現(xiàn),大家都來試試看,有沒有猜對結(jié)果 2008-08-23 00:19 飄然

          if (i >= -128 && i <= 127) { // must cache
          return IntegerCache.cache[i + offset];
          }

          所以一般情況下,推薦使用integer.valueOf()方法,盡量不要用new Integer().
          另外這個(gè)cache是jdk5.0之后才有的,1.4版本中是沒有的,樓主可以用1.4編譯試試看。

          注意是用jdk1.4編譯,不能用jdk5設(shè)置編譯選項(xiàng)為1.4.  回復(fù)  更多評論   

          # re: 新發(fā)現(xiàn),大家都來試試看,有沒有猜對結(jié)果 2008-08-24 17:09 凌晨風(fēng)

          這個(gè)應(yīng)該是JDK1.5之后的自動裝箱、拆箱吧!
          -128~127 基本數(shù)據(jù)類型
          大于127 為對象  回復(fù)  更多評論   


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          隨筆檔案

          Java

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 德令哈市| 改则县| 西乌珠穆沁旗| 泗洪县| 大渡口区| 桑植县| 云阳县| 巧家县| 锦州市| 鹤岗市| 新巴尔虎左旗| 乐陵市| 农安县| 漳州市| 三台县| 光山县| 额尔古纳市| 岳普湖县| 青川县| 沁源县| 海丰县| 峨边| 沈丘县| 苗栗县| 吉安县| 古蔺县| 吐鲁番市| 闵行区| 雷山县| 江达县| 南乐县| 托克逊县| 太谷县| 阿图什市| 清徐县| 尼勒克县| 高邑县| 金塔县| 兴仁县| 乐平市| 来凤县|