[英]Java Wrapper equality test
public class WrapperTest {
public static void main(String[] args) {
Integer i = 100;
Integer j = 100;
if(i == j)
System.out.println("same");
else
System.out.println("not same");
}
}
上面的代碼在運行時給出same
的輸出,但是如果我們將i
和j
的值更改為1000,則輸出變為not same
。 在我為SCJP做准備時,需要明確這個概念。 有人可以解釋這種行為。謝謝。
在Java中,-128和127(包括)之間的整數通常由相同的Integer對象實例表示。 這是通過使用一個名為IntegerCache的內部類(包含在Integer類中,並在調用Integer.valueOf()時或在自動裝箱期間使用)來處理的:
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
}
基本上-127和127之間的整數是“緩存”的,這樣當你使用這些數字時,你總是在內存中引用相同的數字,這就是你的==
有效的原因。
超出該范圍的任何整數都不會被緩存,因此引用不相同。
@tunaranch是對的。 它也與此Python問題中的問題相同 。 要點是Java為-128到127之間的整數保留一個對象(Python確實為-5到256),並且每次請求時都返回相同的對象。 如果你要求在這個固定范圍之外的整數,它每次都會給你一個新的對象。
(回想一下, ==
返回兩個對象是否實際相同,而equals
比較它們的內容。)
如果被裝箱的值p為
true
,false
,一個byte
,范圍為\
到\
的char
,或者介於-128和127之間的int或短號,則讓r1和r2為任意兩個裝箱轉換的結果p。 始終是r1 == r2的情況。
請注意,這也描述了其他類型的情況。
這與平等和自動裝箱有關: http ://web.archive.org/web/20090220142800/http://davidflanagan.com/2004/02/equality-and-autoboxing.html
您的代碼無法編譯。 這就是我得到的:
線程“main”中的異常java.lang.Error:未解決的編譯問題:類型不匹配:無法從int轉換為Integer類型不匹配:無法從int轉換為Integer
at WrapperTest.main(WrapperTest.java:5)
變量i和j是Integer對象的實例。 不要使用“==”運算符比較對象的實例,而是使用“equals”方法。
問候
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.