簡體   English   中英

Java Wrapper相等測試

[英]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的輸出,但是如果我們將ij的值更改為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);
    }
}

另見: http//www.owasp.org/index.php/Java_gotchas

基本上-127和127之間的整數是“緩存”的,這樣當你使用這些數字時,你總是在內存中引用相同的數字,這就是你的==有效的原因。

超出該范圍的任何整數都不會被緩存,因此引用不相同。

@tunaranch是對的。 它也與此Python問題中的問題相同 要點是Java為-128到127之間的整數保留一個對象(Python確實為-5到256),並且每次請求時都返回相同的對象。 如果你要求在這個固定范圍之外的整數,它每次都會給你一個新的對象。

(回想一下, ==返回兩個對象是否實際相同,而equals比較它們的內容。)

編輯 :這是Java語言規范的 5.1.7節中的相關段落:

如果被裝箱的值ptruefalse ,一個byte ,范圍為\\char ,或者介於-128和127之間的int或短號,則讓r1r2為任意兩個裝箱轉換的結果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM