問題:請介紹一下Java里integer和int的區別,以及如何比較相等?
答:
1.Integer是int的包裝類,int是基本數據類型。
2.Integer變量必須實例化以后才能使用,int不用
3.Integer實際上是一個對象,int只是數據值。
4.Integer默認Null,int默認0
下面是一些Integer 的用法和注意事項:
- “==”和equals():Integer變量實際上是對一個Integer對象的引用,所以兩個通過new生成的Integer變量永遠是不相等的(new生成的是兩個對象,其內存地址不同)。
-
在Integer類中,“==”用來比較對象地址是否相同,並且Integer類重寫了equals(Object obj)方法,在equals(Object obj)方法中,會先判斷參數中的對象obj是否是Integer類型的對象,如果是則判斷值是否相同,值相同則返回true,值不同則返回false,如果obj不是Integer類的對象,則返回false。需要注意的是:當參數是基本類型int時,編譯器會給int自動裝箱成Integer類,然后再進行比較。
既然提到了拆箱和裝箱, 裝箱就是由基本數據類型封裝成類的過程, 反而反之
那么
什么時候會拆箱?——基本數據類型和引用數據類型做運算時
什么時候會裝箱?——基本數據類型賦值給引用數據類型的時候。
-
1 Integer i = new Integer(1); 2 Integer j = new Integer(1); 3 System.out.print(i == j); 4 //false
- Integer變量和int變量比較時,只要兩個變量的值是向等的,則結果為true(包裝類Integer和基本數據類型int比較時,java會自動拆包裝為int,然后進行比較,實際上就變為兩個int變量的比較)
1 Integer i = new Integer(1); 2 int j = 1; 3 System.out.print(i == j); 4 //true
- 非new生成的Integer變量和new Integer()生成的變量比較時,結果為false。(因為非new生成的Integer變量指向的是java常量池中的對象,而new Integer()生成的變量指向堆中新建的對象,兩者在內存中的地址不同)
1 Integer i = new Integer(1); 2 Integer j = 1; 3 System.out.print(i == j); 4 //false
- 對於兩個非new生成的Integer對象,進行比較時,如果兩個變量的值在區間-128到127之間,則比較結果為true,如果兩個變量的值不在此區間,則比較結果為false
1 Integer i = 1; 2 Integer j = 1; 3 System.out.print(i == j); 4 //true
Integer i = 128; Integer j = 128; System.out.print(i == j); //false
這條乍看起來絕對是蒙蔽的, 一樣的方式怎么有的時候返回真有的時候為假呢?
因為JVM中一個字節一下的整型數據(即[128,127])會在JVM啟動時加載進內存,除非用new Integer()顯示的創建對象,否則都是同一對象。Integer i = 1時,會將1進行緩存,下次再寫Integer j = 1時,就會直接從緩存中取,就不會new了, 這樣取到的1 地址也是相同的, ==判斷返回真,
對於-128到127范圍之外的數 實際上就是new得到的, 地址不同==判斷為假
對於這點感興趣的可以看看這個解釋:
java在編譯Integer i = 100 ;時,會翻譯成為Integer i = Integer.valueOf(100);
所以關鍵就是看valueOf()函數了。JDK源碼的valueOf()是這樣的:1 public static Integer valueOf(int i) 2 { 3 assert IntegerCache.high >= 127; 4 if (i >= IntegerCache.low && i <= IntegerCache.high) 5 { 6 return IntegerCache.cache[i + (-IntegerCache.low)]; 7 } 8 return new Integer(i); 9 }
Integer的 屬性和方法
https://www.cnblogs.com/LinQingYang/p/12467233.html
官方API ——Interger
https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html
引用地址
版權聲明:本文為CSDN博主「NO0b」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/q5706503/article/details/83386365