您好,登錄后才能下訂單哦!
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中值類型和引用類型的比較與問題解決問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。