判斷Integer類型的值是否相等
我們知道Integer是int的包裝類,在jdk1.5以上,可以實現自動裝箱拆箱,就是jdk里面會自動幫我們轉換,不需要我們手動去強轉,所以我們經常在這兩種類型中隨意寫,平時也沒什么注意 但Integer他是對象,我們知道 == 比較的是堆中的地址,但有個奇怪的事是, 如果 Integer a = 123, Integer b = 123,可以返回true,但如果Integer a = 12345, Integer b = 12345,返回false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public class Demo { public static void main(String[] args) { Integer c = - 128 ; Integer d = - 128 ; System.out.println( "c == d: " + (c == d)); System.out.println( "c.equals(d): " + c.equals(d)); System.out.println( "c.intValue() == d.intValue(): " + (c.intValue() == d.intValue())); System.out.println( "Objects.equals(c, d): " + Objects.equals(c, d)); Integer e = 127 ; Integer f = 127 ; System.out.println( "e == f: " + (e == f)); System.out.println( "e.equals(f): " + e.equals(f)); System.out.println( "e.intValue() == f.intValue(): " + (e.intValue() == f.intValue())); System.out.println( "Objects.equals(e, f): " + Objects.equals(e, f)); Integer g = 128 ; Integer h = 128 ; System.out.println( "g == h: " + (g == h)); System.out.println( "g.equals(h): " + g.equals(h)); System.out.println( "g.intValue() == h.intValue():" + (g.intValue() == h.intValue())); System.out.println( "Objects.equals(g, h): " + Objects.equals(g, h)); } } |
結果如下:
c == d: true
c.equals(d): true
c.intValue() == d.intValue(): true
Objects.equals(c, d): true
e == f: true
e.equals(f): true
e.intValue() == f.intValue(): true
Objects.equals(e, f): true
g == h: false
g.equals(h): true
g.intValue() == h.intValue():true
Objects.equals(g, h): true
(1)當用“==”進行比較時,jvm默認是比較數據在java堆的地址。int是一種基本數據類型,jvm會自動將Integer轉成int數值進行比較。在Integer類中,有一個內部靜態類IntegerCache ,用來支持自動拆箱和裝箱,如下,數值范圍[-128,127]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
/** * Cache to support the object identity semantics of autoboxing for values between * -128 and 127 (inclusive) as required by JLS. * * The cache is initialized on first usage. The size of the cache * may be controlled by the -XX:AutoBoxCacheMax=<size> option. * During VM initialization, java.lang.Integer.IntegerCache.high property * may be set and saved in the private system properties in the * sun.misc.VM class. */ 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 ) { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127 ); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low)); } high = h; cache = new Integer[(high - low) + 1 ]; int j = low; for ( int k = 0 ; k < cache.length; k++) cache[k] = new Integer(j++); } private IntegerCache() {} } |
默認IntegerCache.low 是-127,Integer.high是128,如果在這個區間[-128,127]內,他就會把變量i當做一個變量,放到內存中,用“==”比較是會得出true;但如果不在這個范圍內,就會去new一個Integer對象,當運用“==”時,會比較Integer兩個對象地址,得出false。
比較兩個Integer的值是否相同,方法比較多:
1、推薦用equals(),這個還可以避免一些空指針問題的出現。
2、或者使用Integer.intValue();這樣出來的就是int值,就可以直接比較了(可能會拋出空指針異常);
Integer賦值比較
Integer是int的包裝類,繼承Number類另實現Comparable接口,其取值范圍為:-2147483648~2147483647
賦值操作
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Integer newInt = new Integer( 10 ); //自動裝箱操作,編譯后class文件中為:Integer num = Integer.valueOf(10); Integer num = 10 ; //num.intValue()為解包操作 int intNum = num.intValue(); /** * 輸出結果為true----false----true,原因: * 1、 Integer為引用類型,引用類型棧中變量表示一個地址指向堆中的一片內存空間 * 2、 newInt.equals(num)為true是因為Integer重寫了equals方法,equals方法中實際是值比較 * 3、(newInt == num)為false因為兩個變量不指向同一片內存 * 4、(intNum==num)結果為true是因為intNum是基本數據類型,值直接存在棧中,兩者比較的是值 */ System.out.println(newInt.equals(num)+ "----" +(newInt == num)+ "----" +(intNum==num)); |
1
2
3
4
5
6
7
8
|
private final int value; public boolean equals(Object obj) { if (obj instanceof Integer) { //將對象強制轉換為Integer類型,然后自動拆箱進行==比較 return value == ((Integer)obj).intValue(); } return false ; } |
構造函數
1
2
3
4
5
6
7
8
|
public Integer( int value) { //參數為int 直接賦值 this .value = value; } public Integer(String s) throws NumberFormatException { //參數為String的情況下調用paseInt()方法進行賦值,10表示為按10進制轉換 this .value = parseInt(s, 10 ); } |
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://www.cnblogs.com/ryelqy/p/11014766.html