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
- HashTable和HashMap的六點區別HashMap
- g++ 和 gcc 的相同點和區別GC
- ERP與SCM間的側重點區別(轉)
- ConcurrentHashMap和HashMap的一點區別HashMap
- promise和Rxjs的一點區別PromiseJS
- 程式入口點EP和OEP的區別
- mixins和元件的區別和優缺點元件
- 【轉載】C#之int與Java之Integer的區別C#Java
- PLSQL Language Reference-BOOLEAN型別-PLS_INTEGER和BINARY_INTEGER資料型別SQLBoolean資料型別
- TCP和UDP的優缺點及區別TCPUDP
- char,nchar,varchar,nvarchar的區別和特點
- getAttribute()和attr()一點區別
- DDD和OO的重要區別:上下文重於抽象抽象
- 淺談C#中重寫和隱藏的區別C#
- 【知識點】 gcc和g++的聯絡和區別GC
- Nginx/Tomcat/Apache的優缺點和區別NginxTomcatApache
- 全面對比 Redis 和 Memcached 的 6 點區別Redis
- Mysql中myisam和innodb的區別,至少5點MySql
- Excel 散點圖和折線圖的區別Excel
- ../和./和/的區別
- createElement與createDocumentFragment的點點區別Fragment
- 重點區域人員徘徊識別監測系統
- 重建模與重構的區別
- pls_integer型別型別
- 和 的區別
- as 和 with的區別
- ||和??的區別
- /*和/**的區別
- Mysql RC/RR隔離原理和區別 不可重複讀和可重複讀MySql