Java拆裝箱深度剖析
先來看一段程式碼:
public class Main{ public static void main(String[] args){ Integer num1 = 100; Integer num2 = 100; Integer num3 = 200; Integer num4 = 200; '''//输出结果''' System.out.println(num1==num2); System.out.println(num3==num4); } }
猜猜結果是什麼?
很多人會認為結果全為true,但結果去不是這樣的
true
false
為什麼是這樣的結果?如果用記憶體來解釋結果的話,num1和num2指向的是同一個對象,而num3和num4則指向的確是不同的對象。接下來就告訴你為什麼,看看Integer類型的valueof方法的源碼:
public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + 128]; return new Integer(i); }
其中IntegerCache的實作:
'''// IntegerCache,一个内部类,注意它的属性都是定义为static final''' private static class IntegerCache { static final int high; '''//缓存上界,暂为null''' static final Integer cache[]; '''//缓存的整型数组''' '''// 块,为什么定义为块''' static { final int low = -128; '''// 缓存下界,不可变了。只有上界可以改变''' '''// high value may be configured by property''' '''// h值,可以通过设置jdk的AutoBoxCacheMax参数调整(以下有解释),自动缓存区间设置为[-128,N]。注意区间的下界是固定''' int h = 127; if (integerCacheHighPropValue != null) { '''// Use Long.decode here to avoid invoking methods that''' '''// require Integer's autoboxing cache to be initialized''' // 通过解码integerCacheHighPropValue,而得到一个候选的上界值''' int i = Long.decode(integerCacheHighPropValue).intValue(); '''// 取较大的作为上界,但又不能大于Integer的边界MAX_VALUE''' 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++); '''// -128到high值逐一分配到缓存数组''' } private IntegerCache() {} }
其中IntegerCache的實作:
public class Main{ public static void main(String[] args){ Double i1 = 100.0; Double i2 = 100.0; Double i3 = 200.0; Double i4 = 200.0; System.out.println(i1==i2); System.out.println(i3==i4); } }
valueof方法建立Integer型別物件時,取值範圍為[-128,127],數值在這個區間裡,指標指向IntegerCache.cache中已經存在的物件引用,當數值超出這個範圍,就會建立一個新的物件。 有一點要注意的是,並不是所有的類型都是這個範圍,看Double類型:
public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); }
false
,大夥可以去看看原始碼中Double valueof方法的實現,其和Integer valueof方法不同,是因為在某個範圍內的整數數值的個數是有限的,而浮點數卻不是。
注意,Integer、Short、Byte、Character、Long這幾個類別的valueOf方法的實作是類似的。
Double、Float的valueOf方法的實作是類似的。
拉下了一個,Boolean類型的結果有兩個True or False。直接看原始碼:
public static final Boolean TRUE = new Boolean(true); '''/** ''' '''* The <code>Boolean</code> object corresponding to the primitive ''' '''* value <code>false</code>. ''' '''*/''' public static final Boolean FALSE = new Boolean(false);
而其中的TRUE和FALSE是這樣定義的:
大家多多支援PHP中文網。
更多Java拆裝箱深度剖析相關文章請關注PHP中文網!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

在使用IntelliJIDEAUltimate版本啟動Spring...

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...
