todayx.org
          todayx.org
          posts - 39,comments - 60,trackbacks - 0
          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/

          jdk1.5以后
          用Integer舉例
          Integer a = 3;              這是自動裝箱
          int     i = new Integer(2); 這是自動拆箱
          就是基本類型和其對應的包裝類型在需要的時候可以互相轉換,具體過程由編譯器完成
          比如自動裝箱:
          Integer a=3;
          其實編譯器調用的是static Integer valueOf(int i)這個方法
          查閱JDK知道,
          valueOf(int i)返回一個表示指定的 int 值的 Integer 對象
          那么就變成這樣: Integer a=3;   =>    Integer a=Integer.valueOf(3);

          對應的  int intValue()  返回該 Integer對象的int值,是拆箱

          我們再來看Integer緩存, 
          下面是IntegerCache類的源碼

          Java代碼  收藏代碼
          1. private static class IntegerCache   //定義類名  
          2. {    
          3.     static final int high;    
          4.     static final Integer cache[];   //cache緩存是一個存放Integer類型的數組  
          5.   
          6.     static  //初始化  
          7.     {    
          8.         final int low = -128;       //最小值是固定的  
          9.         int h = 127;                //最大值暫時是127  
          10.         if (integerCacheHighPropValue != null) //這段if代碼不用深究,是一些判斷,我看得眼花啊  
          11.         {    
          12.             int i = Long.decode(integerCacheHighPropValue).intValue();    
          13.             i     = Math.max(i, 127);    
          14.             h     = Math.min(i, Integer.MAX_VALUE - -low);    
          15.         }    
          16.         high = h;  //此時high就是127  
          17.   
          18.         cache = new Integer[(high - low) + 1];  //有256個元素  
          19.         int j = low;                            //j的初始值是-128  
          20.         for(int k = 0; k < cache.length; k++)   //緩存區間數據     
          21.             cache[k] = new Integer(j++);        //將-128~127包裝成256個對象存入緩存  
          22.     }    
          23.     private IntegerCache(){}  //構造方法,不需要構造什么  
          24. }  

           

          再來看valueOf方法

          Java代碼  收藏代碼
          1. public static Integer valueOf(int i)   
          2. {    
          3.     if(i >= -128 && i <= IntegerCache.high)  
          4.     {  
          5.         //如果i在-128~127之間,就直接在緩存中取出i的Integer類型對象  
          6.         return IntegerCache.cache[i + 128];    
          7.     }      
          8.     else  
          9.     {  
          10.         return new Integer(i);  //否則就在堆內存中創建  
          11.     }      
          12. }   

           

          valueOf方法會自動調用IntegerCache這個類,
          IntegerCache初始化后內存中就有Integer緩沖池cache[]了,
          -128~127區間的int值有其對應的的包裝對象
          java使用該機制是為了達到最小化數據輸入和輸出的目的,這是一種優化措施,提高效率
          其他的包裝器:
          Boolean: (全部緩存)
          Byte:    (全部緩存)

          Character (   <=127 緩存)
          Short     (-128~127 緩存)
          Long      (-128~127 緩存)

          Float     (沒有緩存)
          Doulbe    (沒有緩存)

          ====================================================

          知道了這個原理我們再來看一些網上關于java的有趣問題,就能知道答案了

          下面我們對一網友帖子中的問題的做解答,我當時也是看到這個帖子才baidu學到這些內容的

          http://xiaoyu1985ban.iteye.com/blog/1384191

          主題:java迷題:等于,還是不等于?

          代碼片段1

          public static void main(final String[] args) {  

              Integer a = new Integer(100);  

              Integer b = 100;  

              System.out.println(a == b);   

          } 

          解答:

          結果輸出 false

          因為new Integer(100)是指明了再堆內存中創建對象

          Integer b = 100; 這句是自動裝箱,

          得到的是Integer緩沖池中的對象,是這句代碼return IntegerCache.cache[100 + 128]

          明顯ab的地址是不一樣的,不是同一個對象

           

          代碼片段2

          public static void main(final String[] args) {  

              Integer a = 100;  

              Integer b = 100;  

              System.out.println(a == b);   

          } 

          解答:

          結果輸出 true

          ab指向了同一個對象,都是IntegerCache.cache[100 + 128]

           

          代碼片段3

          public static void main(final String[] args) {  

              Integer a = 156;  

              Integer b = 156;  

              System.out.println(a == b);   

          } 

          解答:

          結果輸出 false

          由于156大于128,它的包裝對象不在緩沖池中,而是執行 return new Integer(156);

          new2,都在堆內存中,但地址不一樣

           

          代碼片段4

          public static void main(final String[] args) {  

              Integer a = Integer.valueOf(100);  

              Integer b = 100;  

              System.out.println(a == b);   

          }

          解答:

          結果輸出 true

          我們上面說過了,Integer b = 100 就相當于Integer b=Integer.valueOf(100)

          所以ab指向緩沖池中的同一對象



          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
          posted on 2012-02-01 00:23 todayx.org 閱讀(1692) 評論(0)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 利川市| 浮山县| 通化县| 富蕴县| 南郑县| 英德市| 萝北县| 刚察县| 元江| 乐亭县| 南汇区| 临澧县| 田东县| 炉霍县| 苍溪县| 香格里拉县| 西乌珠穆沁旗| 云龙县| 宣恩县| 奉新县| 和龙市| 乌兰察布市| 乡宁县| 镇巴县| 汝州市| 英超| 遂溪县| 台安县| 衡南县| 财经| 金寨县| 红原县| 涞水县| 扶沟县| 中宁县| 永定县| 保靖县| 阳城县| 彭泽县| 汤阴县| 昌乐县|