中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中值類型和引用類型的比較與問題解決

發布時間:2021-12-07 19:23:44 來源:億速云 閱讀:171 作者:柒染 欄目:編程語言

Java中值類型和引用類型的比較與問題解決,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

一、問題描述

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

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

這個大家應該都是沒問題的,很簡單。值類型比較是比較值,引用類型是比較地址。對于正常的操作來說,比較值類型我們可以直接使用 == ,引用類型就使用equals來做比較就不會出現問題。

引用類型

/**  * 測試Integer  */ public static void test_Integer(){  Integer number_01 = 10;  Integer number_02 = 10;  System.out.println(number_01.equals(number_02)); }

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

值類型

/**  * 測試int  */ public static void test_Int(){  int number_01 = 10;  int number_02 = 10;  System.out.println(number_01 == number_02); }

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

三、問題

但是問題就出現在,開發的使用為了防止出現為null的時候會被系統使用0來代替,所以就使用了Integer類型來做操作,并且在比較的時候用了 == 。這就很尷尬了,開始自測完全沒出現問題,因為沒到達記錄數。很開心,把代碼提交下班,妥妥的。但是尷尬的事情來了,測試報告出現在了郵箱里面了。

初始沒問題的情況

/**  * 測試Integer  */ public static void test_Integer(){  Integer number_001 = 10;  Integer number_002 = 10;  System.out.println(number_001 == number_002); }

結果:

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

/**  * 測試Integer  */ public static void test_Integer(){  Integer number_001 = 128;  Integer number_002 = 128;  System.out.println(number_001 == number_002); }

結果:

四、解決

后面一想,很快確定問題了。是自己的馬虎,偷懶使用了 == ,造成這次問題的出現,當改為equals就可以妥妥的回家了。開始自測沒問題主要還是因為Integer 的緩存搞的事情。扒拉到Integer的源碼,發現里面用了緩存機制,對-128~127的值做了緩存,如果在這個值區間內使用==來做比較的話,比較的就是值了,所以才造成開始以為沒問題,后面運行了一段時間后就出現問題了。當不在值區間內就必須使用equals來完成比較。

private static class IntegerCache {    

static final int low = -128;    

static final int high;    

static final Integer cache[];    

static {     

 // high value may be configured by property     

 int h = 127;      

String integerCacheHighPropValue =        sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");     

 if (integerCacheHighPropValue != null) {        try {          int i = parseInt(integerCacheHighPropValue);         

 i = Math.max(i, 127);          

// Maximum array size is Integer.MAX_VALUE          h = Math.min(i, Integer.MAX_VALUE - (-low) -1);      

  } catch( NumberFormatException nfe) {          

// If the property cannot be parsed into an int, ignore it. 

       }   

   }      high = h;     

 cache = new Integer[(high - low) + 1];     

 int j = low;     

 for(int k = 0; k < cache.length; k++)       

 cache[k] = new Integer(j++);     

 // range [-128, 127] must be interned (JLS7 5.1.7)      assert IntegerCache.high >= 127;    

    }    

private IntegerCache() {

    } 

 }

關于Java中值類型和引用類型的比較與問題解決問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

精河县| 绥中县| 犍为县| 济源市| 东源县| 广宁县| 哈尔滨市| 饶阳县| 交城县| 贵南县| 百色市| 铁力市| 太白县| 苏尼特左旗| 丰镇市| 沾化县| 忻城县| 镇远县| 天气| 武城县| 旺苍县| 双鸭山市| 安远县| 郯城县| 孟州市| 兴安盟| 成安县| 宣武区| 广安市| 郯城县| 涿鹿县| 镇安县| 普宁市| 沭阳县| 两当县| 安化县| 肃南| 漾濞| 洪湖市| 恭城| 阳新县|