Integer,int 數字進行比較
背景:兩個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(
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型別,將記憶體中的數值進行比較