昨天跟朋友一起吃飯,他說到兩個Integer類型值比較是否相等的問題,。經(jīng)理也在這里把java的Integer值比較的問題拿出來說一說,。因為在面試的時候這個是經(jīng)常遇到的問題。 首先給大家看一個例子: 1public class Test { 運行一下,,在控制臺得到的結(jié)果是這樣的2 3 /** 4 * 關(guān)于Integer大小比較問題 5 * @author 經(jīng)理 6 */ 7 public static void main(String[] args) { 8 Integer a = 10; 9 Integer b = 10; 10 System.out.println("a==b : " + String.valueOf(a==b)); 11 System.out.println("a.equals(b) : " + String.valueOf(a.equals(b))); 12 } 13} 14 a==b : true a.equals(b) : true 當是當我們變換一下值 1public class Test { 2 3 /** 4 * 關(guān)于Integer大小比較問題 5 * @author 經(jīng)理 6 */ 7 public static void main(String[] args) { 8 Integer a = 1000; 9 Integer b = 1000; 10 System.out.println("a==b : " + String.valueOf(a==b)); 11 System.out.println("a.equals(b) : " + String.valueOf(a.equals(b))); 12 } 13} 運行一下,,控制臺的結(jié)果又是 a==b : false a.equals(b) : true 這是什么原因呢?我當時也有點犯糊涂,。有點沖動就直接開源碼看了,。 實際上在我們用Integer a = 數(shù)字;來賦值的時候Integer這個類是調(diào)用的public static Integer valueOf(int i)這個方法,。 1public static Integer valueOf(int i) { 我們來看看ValueOf(int i)的代碼,,可以發(fā)現(xiàn)他對傳入?yún)?shù)i做了一個if判斷。在-128<=i<=127的時候是直接用的int原始數(shù)據(jù)類型,,而超出了這個范圍則是new了一個對象,。我們知道"=="符號在比較對象的時候是比較的內(nèi)存地址,而對于原始數(shù)據(jù)類型是直接比對的數(shù)據(jù)值,。那么這個問題就解決了,。2 if(i >= -128 && i <= IntegerCache.high) 3 return IntegerCache.cache[i + 128]; 4 else 5 return new Integer(i); 6 } 至于為什么用int型的時候值會在-128<=i<=127范圍呢呢?我們知道八位二進制的表示的范圍正好就是-128到127。大概就是因為這吧,。 把平時出現(xiàn)的問題記錄下來,,自己就可以一點一點進步了。 |
|