2012-11-16 31 views
-4

代碼:整數指代相同的對象

Integer a1 = 100; 
Integer a2 = 100; 
System.out.println(a1 == a2); // true 

Integer b1 = new Integer(100); 
Integer b2 = new Integer(100); 
System.out.println(b1 == b2); // false 

Integer c1 = 150; 
Integer c2 = 150; 
System.out.println(c1 == c2); // false 

爪哇設計,使用自動裝箱時,-128和127之間的值似乎是指相同的Integer對象,這使得第一代碼段的不同的結果和最後一個

我的問題是:爲什麼Java設計它是這樣的,有沒有什麼優勢?

+0

你認爲它可能有什麼優勢?您對該主題的研究結果如何?嘗試使用'-XX:+ AggressiveOpts'運行相同的程序http://stackoverflow.com/a/11882284/57695 –

+1

嘗試創建一個包含一百萬個小整數的數組,您將看到優勢。 –

+0

@dystroy我不確定這是一個重複的問題,這個問題要求緩存整數的好處,而不是爲什麼代碼的行爲方式。 – assylias

回答

3

簡單的基本原理是有一套整數已經創建並可用於裝箱是有用/有效的。很可能如果一個應用程序需要盒裝整數,它們將會處於一定的範圍內(例如1 ......無論如何)。事實上,他們被裝箱到-127/128是一個簡單的設計啓發式,基於什麼可能提供的好處沒有預裝大量的整數。

+0

+1 - 我想象的是,Java工程師測試了許多典型的客戶應用程序,並確定緩存256個整數實際上是一個很好的大小。 –

2

這是一種優化,因爲很多數值操作都在所提到的區間中使用了int值。

+0

這是某種類型的Flyweight設計模式的實現嗎? – Burkhard

+0

不是。輕量級可以將多個對象映射到相同的底層 –

2

整數被-128和127這是Java Language Specification的一部分之間緩存值:

如果被裝箱值p爲真,假,字節,或在範圍\ u0000的炭到\ u007f或在-128到127(含)之間的整數或短數,然後讓r1和r2是p的任意兩次裝箱轉換的結果。 r1 == r2總是如此。

該行爲的原因在同一節中給出:默認行爲是==比較始終返回true,但由於性能原因它已被限制爲該範圍。

理想情況下,對給定的原始值p進行裝箱將始終產生相同的參考。實際上,使用現有的實現技術可能不可行。 [...]
此[範圍限制]可確保在大多數情況下,行爲將成爲理想的行爲,不會對性能造成不必要的損失,特別是在小型設備上。例如,內存限制較少的實現可能會緩存所有char和short值,以及-32K到+ 32K範圍內的int和long值。

相關問題