3 回答

TA貢獻(xiàn)1851條經(jīng)驗 獲得超5個贊
不,數(shù)字常量池的工作方式不同于字符串。對于字符串,只保留編譯時常量-而對于整數(shù)類型的包裝器類型,如果任何裝箱操作都適用于該值,則任何裝箱操作都將始終使用該池。因此,例如:
int x = 10;
int y = x + 1;
Integer z = y; // Not a compile-time constant!
Integer constant = 11;
System.out.println(z == constant); // true; reference comparison
JLS保證池值的范圍很小,但是實現(xiàn)可以根據(jù)需要使用更大的范圍。
請注意,盡管不能保證,但是我看過的每個實現(xiàn)都可以Integer.valueOf用來執(zhí)行裝箱操作-因此,即使沒有該語言的幫助,您也可以得到相同的效果:
Integer x = Integer.valueOf(100);
Integer y = Integer.valueOf(100);
System.out.println(x == y); // true
從JLS的5.1.7節(jié)開始:
如果裝箱的值p為true,false,一個字節(jié)或介于\ u0000到\ u007f范圍內(nèi)的char或-128到127(含)之間的整數(shù)或短數(shù),則令r1和r2為p的任何兩次拳擊轉(zhuǎn)換。r1 == r2總是這樣。
理想情況下,將給定的原始值p裝箱將始終產(chǎn)生相同的參考。實際上,使用現(xiàn)有的實現(xiàn)技術(shù)可能不可行。以上規(guī)則是一種務(wù)實的妥協(xié)。上面的最后一個子句要求始終將某些通用值裝在無法區(qū)分的對象中。該實現(xiàn)可以懶惰地或急切地緩存它們。對于其他值,此公式不允許對程序員方面的帶框值的身份進行任何假設(shè)。這將允許(但不要求)共享部分或全部這些引用。
這樣可以確保在大多數(shù)情況下,行為都是理想的,而不會造成不必要的性能損失,尤其是在小型設(shè)備上。例如,較少內(nèi)存限制的實現(xiàn)可能會緩存所有char和short值,以及-32K到+ 32K范圍內(nèi)的int和long值。

TA貢獻(xiàn)1804條經(jīng)驗 獲得超7個贊
Java維護從-128到的Integer池127
像下面這樣聲明整數(shù)
Integer i1 = 127;
結(jié)果到
Integer i1 = Integer.valueOf(127);
所以第一種情況實際發(fā)生的是
Integer i1 = 127;<---Integer.valueOf(127);
Integer i2 = 127;<---Integer.valueOf(127);<---Same reference as first
從Integerfor類 valueOf 方法的源代碼
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
因此,如果值介于-128到之間,則得到相同的引用,127然后調(diào)用valueOf它,否則它將返回new Integer(i)
并且由于引用相同,因此您的==運算符適用valueOf于此范圍之間返回的整數(shù)。

TA貢獻(xiàn)1876條經(jīng)驗 獲得超6個贊
Java緩存range中的整數(shù)對象-128 to 127。因此,當(dāng)您嘗試在此范圍內(nèi)為wrapper對象分配一個值時,該boxing操作將調(diào)用Integer.valueOf方法,然后它將對池中已存在的對象分配一個引用。
另一方面,如果將超出此范圍的值分配給wrapper引用類型,Integer.valueOf則會Integer為該值創(chuàng)建一個新對象。因此,比較具有超出此范圍值的referencefor Integer對象將為您提供false
所以,
Integer i = 127; --> // Equivalent to `Integer.valueOf(127)`
Integer i2 = 127;
// Equivalent to `Integer.valueOf(128)`
// returns `new Integer(128)` for value outside the `Range - [-128, 127]`
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i == i2); // true, reference pointing to same literal
System.out.println(i3 == i4); // false, reference pointing to different objects
但是,當(dāng)您使用new運算符創(chuàng)建整數(shù)實例時,將在堆上創(chuàng)建一個新對象。所以,
Integer i = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i == i2); // false
添加回答
舉報