<a href="http://www.blogjava.net/zhangyuan/archive/2010/07/24/327011.html" target="_blank">關于Integer大小比較的問題</a>
昨天跟朋友一起吃飯,他說到兩個Integer類型值比較是否相等的問題。經理也在這裡把java的Integer值比較的問題拿出來說一說。因為在面試的時候這個是經常遇到的問題。
首先給大家看一個例子:
1
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) public class Test {
2
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) 3
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) /**
4
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) * 關于Integer大小比較問題
5
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) * @author 經理
6
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) */
7
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) public static void main(String[] args) {
8
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) Integer a = 10;
9
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) Integer b = 10;
10
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) System.out.println("a==b : " + String.valueOf(a==b));
11
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) System.out.println("a.equals(b) : " + String.valueOf(a.equals(b)));
12
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) }
13
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) }
14
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) 運作一下,在控制台得到的結果是這樣的
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) a==b : true
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) a.equals(b) : true
當是當我們變換一下值
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) Integer a = 1000;
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) Integer b = 1000;
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) 運作一下,控制台的結果又是
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) a==b : false
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) 這是什麼原因呢?我當時也有點犯糊塗。有點沖動就直接開源碼看了。
實際上在我們用Integer a = 數字;來指派的時候Integer這個類是調用的public static Integer valueOf(int i)這個方法。
1
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) public static Integer valueOf(int i) {
2
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) if(i >= -128 && i <= IntegerCache.high)
3
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) return IntegerCache.cache[i + 128];
4
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) else
5
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) return new Integer(i);
6
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣) 我們來看看ValueOf(int i)的代碼,可以發現他對傳入參數i做了一個if判斷。在-128<=i<=127的時候是直接用的int原始資料類型,而超出了這個範圍則是new了一個對象。我們知道"=="符号在比較對象的時候是比較的記憶體位址,而對于原始資料類型是直接比對的資料值。那麼這個問題就解決了。
至于為什麼用int型的時候值會在-128<=i<=127範圍呢呢?我們知道八位二進制的表示的範圍正好就是-128到127。大概就是因為這吧。
實際上這也就是java 自動裝箱、拆箱的運用:http://ycgit.blog.51cto.com/8590215/1637992
本文轉自 藝晨光 51CTO部落格,原文連結:http://blog.51cto.com/ycgit/1637975,如需轉載請自行聯系原作者