10.int和Integer的區別(重點)
是不是覺得這個很簡單?那不如先來一個題目吧!
根據下面程式碼寫出輸出結果:
Integer i1 = new Integer(12);
Integer i2 = new Integer(12);
System.out.println(i1 == i2);
Integer i3 = 126;
Integer i4 = 126;
int i5 = 126;
System.out.println(i3 == i4);
System.out.println(i3 == i5);
Integer i6 = 128;
Integer i7 = 128;
int i8 = 128;
System.out.println(i6 == i7);
System.out.println(i6 == i8);
可以執行一下看一下結果,和你想的是不是一樣!
原因分析:
Integer i1 = new Integer(12);
Integer i2 = new Integer(12);
System.out.println(i1 == i2);
相信這個不難,應該答對了!
一但看到 new 這個關鍵字,是一定會在記憶體中開闢一塊新記憶體用來存放物件的。所以這個題根本都不用看值是不是一樣,直接就是 false。
來看第二部分
Integer i3 = 126;
Integer i4 = 126;
int i5 = 126;
System.out.println(i3 == i4);
System.out.println(i3 == i5);
這裡先說 i3 == i5 的比較,因為一個是 int 一個是 Integer 型別,所以這時候會對 Integer 型別的變數進行拆箱操作,然後在跟 int 型別的變數進行比較。所以這時候其實是兩個int型別的比較,結果是 true。
i3 == i4 和下邊那部分一塊分析。
第三部分
Integer i6 = 128;
Integer i7 = 128;
int i8 = 128;
System.out.println(i6 == i7);
System.out.println(i6 == i8);
i6 == i8 的原因在上邊第二部分分析過了,所以這裡不再說明。
主要說明 i6 == i7 和 上邊的 i3 == i4 的原因。
在對Integer型別的變數通過字面量賦值的時候(Integer i = 1 ,這種形式就是字面量賦值),在底層會呼叫 Integer.valueOf
方法。而Integer類的內部維護了一個 Integer型別的 -128 ~ 127
的陣列,如果賦值的在這個範圍內,會直接使用這裡邊的物件。不在這個範圍的數字,則會通過new 的方式新建一個物件。
看到這裡應該知道為什麼會產生這樣的結果了吧!
最後放一下Integer類中的 緩衝陣列原始碼:
這裡是valueOf方法
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
這裡看到,如果 i 滿足條件 i >= IntegerCache.low && i <= IntegerCache.high
就會返回
IntegerCache.cache[i + (-IntegerCache.low)]
,返回 cache陣列中的一個元素。
下邊揭祕關鍵部分。 這裡只拉取部分程式碼。
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;
// ...
high = h;
到這裡就可以看出來範圍是 -128 ~ 127 之間了,在這個範圍會返回陣列中已有的元素,不在這個範圍就新建一個。
相關文章
- int和Integer的區別
- int 和 Integer 有什麼區別
- int與Integer的區別
- Integer.valueof(String s)和Integer.parseInt(String s)的具體區別是什麼?
- 方法重置和重寫的區別
- 過載和重寫的區別
- 好程式設計師Java培訓分享int和Integer的區別程式設計師Java
- 碼元和碼點的區別
- Oracle 和 mysql的9點區別OracleMySql
- mixins和元件的區別和優缺點元件
- 程式入口點EP和OEP的區別
- Nginx/Tomcat/Apache的優缺點和區別NginxTomcatApache
- TCP和UDP的優缺點及區別TCPUDP
- 【知識點】 gcc和g++的聯絡和區別GC
- 全面對比 Redis 和 Memcached 的 6 點區別Redis
- ../和./和/的區別
- 淺談C#中重寫和隱藏的區別C#
- DDD和OO的重要區別:上下文重於抽象抽象
- LinkedList和ArrayList的區別、Vector和ArrayList的區別
- http和https的區別/get和post的區別HTTP
- ibatis中integer型別BAT型別
- ||和??的區別
- /*和/**的區別
- CISC和RISC是什麼?它們的特點和區別?
- 軟體危機和軟體缺陷的特點和區別
- 重建模與重構的區別
- 重點區域人員徘徊識別監測系統
- shtml和html網頁另存為的一點區別HTML網頁
- sqlserver索引重建和索引重組的區別和操作方法SQLServer索引
- Mysql RC/RR隔離原理和區別 不可重複讀和可重複讀MySql
- 對SSO單點登入和OAuth2.0的區別和理解OAuth
- Java基本資料型別和Integer快取機制Java資料型別快取
- win10重置和重灌哪個好 win10重置和重灌的區別Win10
- makefile =和:=的區別
- ++a和a++的區別
- ./ 和sh 的區別
- jquery $(this) 和this的區別jQuery
- JQuery this和$(this)的區別jQuery