背景:兩個Integer的數字進行比較,有時返回為true,而有時返回為false。比如以下情況:
1. String s = new String("127"); flag= Integer.valueOf(s.trim()) == Integer.parseInt("127"); System.out.PRintln("==============="+flag); //true
2. int a =600; intb = Integer.valueOf("600"); flag= a==b; System.out.println("==============="+flag); //true 3. Integer a2= Integer.valueOf("800"); Integerb2 = Integer.valueOf((new String("800 ")).trim()); flag= a2 == b2; System.out.println("==============="+flag); //false
4. Integer c = 127; Integer d = 127; System.err.println(c== d); //true
5. c = 128; d = 128; System.err.println(c== d); //false
要說明這個問題,首先應該搞明白Integer和int的關系,int是基本數據類型,是原生的,Integer是引用類型,相當于整型對象,所以在相互賦值和比較的時候就會有變化。
1.Integer a = 127;
底層自動調用valueOf(int i)方法,將127進行裝箱,并將引用賦給a
值得注意的是,當數值超過127時,JVM會開辟新內存存儲。經valueOf方法存儲數值大小范圍在-128 ~127,超過此范圍的數值都會開辟新內存。
2.Integer a = Integer.valueOf((new String("128 ")).trim());
在java.lang.Integer類中,重載valueOf方法,最終調用valueOf(int i)方法,所以存儲規則與裝箱相同。
3.int a = Integer.valueOf((new String("128"));
將Integer轉換為int,底層調用intValue()方法,將引用所指內存中的數值賦值給變量。
4.Integer數值之間的比較
直接將兩個引用的值進行比較即可,所以若兩個值超過127,則兩個引用肯定不同。
5.int數值之間的比較
將兩個數值直接進行比較,int類型的數值大小范圍為-2147483648~2147483647
6.Integer和int類型之間的比較
將Integer拆箱成int類型,將內存中的數值進行比較
新聞熱點
疑難解答