Java的值類型和引用類型

1、問題描述

  前幾天由於一個需求出現了Bug。說高級點也挺高級,說白點也很簡單。其實也就是一個很簡單的Java基礎入門時候的值類型和引用類型的區別。只是開發的時候因爲本身的問題,致使小問題的出現。還好忽然想起來之前看過一篇對於該問題講解的博客,才能快速定位問題的位置。防止下次再犯,順便也就把這個當作筆記記錄下來,放入本身的Bug集中。java

2、值類型和引用類型的比較

  這個你們應該都是沒問題的,很簡單。值類型比較是比較值,引用類型是比較地址。對於正常的操做來講,比較值類型咱們能夠直接使用 == ,引用類型就使用equals來作比較就不會出現問題。面試

引用類型 

1     /**
2  * 測試Integer 3      */
4     public static void test_Integer(){ 5         Integer number_01 = 10; 6         Integer number_02 = 10; 7  System.out.println(number_01.equals(number_02)); 8     }

 

上面的測試結果很明顯是true,絕對沒有問題的。緩存

                                                                  

 

值類型

1     /**
2  * 測試int 3      */
4     public static void test_Int(){ 5         int number_01 = 10; 6         int number_02 = 10; 7         System.out.println(number_01 == number_02); 8     }

 

上面的測試結果很明顯是true,絕對沒有問題的。測試

                                                                    

3、問題

可是問題就出如今,開發的使用爲了防止出現爲null的時候會被系統使用0來代替,因此就使用了Integer類型來作操做,而且在比較的時候用了 == 。這就很尷尬了,開始自測徹底沒出現問題,由於沒到達記錄數。很開心,把代碼提交下班,妥妥的。可是尷尬的事情來了,測試報告出如今了郵箱裏面了。spa

初始沒問題的狀況

1     /**
2  * 測試Integer 3      */
4     public static void test_Integer(){ 5         Integer number_001 = 10; 6         Integer number_002 = 10; 7         System.out.println(number_001 == number_002); 8     }

 

結果:3d

                                                                     

 

 

 

當記錄超過必定數的時候,出現問題

1     /**
2  * 測試Integer 3      */
4     public static void test_Integer(){ 5         Integer number_001 = 128; 6         Integer number_002 = 128; 7         System.out.println(number_001 == number_002); 8     }

 

結果:日誌

                                                                    

4、解決

後面一想,很快肯定問題了。是本身的馬虎,偷懶使用了 == ,形成此次問題的出現,當改成equals就能夠妥妥的回家了。開始自測沒問題主要仍是由於Integer 的緩存搞的事情。扒拉到Integer的源碼,發現裏面用了緩存機制,對-128~127的值作了緩存,若是在這個值區間內使用==來作比較的話,比較的就是值了,因此才形成開始覺得沒問題,後面運行了一段時間後就出現問題了。當不在值區間內就必須使用equals來完成比較。code

 1 private static class IntegerCache {  2         static final int low = -128;  3         static final int high;  4         static final Integer cache[];  5 
 6         static {  7             // high value may be configured by property
 8             int h = 127;  9             String integerCacheHighPropValue =
10                 sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); 11             if (integerCacheHighPropValue != null) { 12                 try { 13                     int i = parseInt(integerCacheHighPropValue); 14                     i = Math.max(i, 127); 15                     // Maximum array size is Integer.MAX_VALUE
16                     h = Math.min(i, Integer.MAX_VALUE - (-low) -1); 17                 } catch( NumberFormatException nfe) { 18                     // If the property cannot be parsed into an int, ignore it.
19  } 20  } 21             high = h; 22 
23             cache = new Integer[(high - low) + 1]; 24             int j = low; 25             for(int k = 0; k < cache.length; k++) 26                 cache[k] = new Integer(j++); 27 
28             // range [-128, 127] must be interned (JLS7 5.1.7)
29             assert IntegerCache.high >= 127; 30  } 31 
32         private IntegerCache() {} 33     }

 

5、總結

當初面試的時候這種東西應該是背的倒背如流,絕對能夠應對面試。可是一旦開發起來就是各類問題都出現了,並且這種東西還不會報出錯日誌,純屬開發問題。歸總來講仍是本身的水平不夠,還須要繼續提升。下次要防止這種低級問題的出現,很尷尬。一樣也是對本身學的東西要融匯貫通,而不是每學一個單獨的知識點就夠了,沒有起到聯通的效果。源碼扒拉一下仍是會加深本身的印象。orm

相關文章
相關標籤/搜索