簡體   English   中英

為什么這段代碼打印100而不是1?

[英]Why does this code print 100 instead of 1?

public class Short {
    public static void main(String[] args) {

        Set s = new HashSet();

        for(short i = 0; i < 100; i++) {
            s.add(i);
            s.remove(i-1);
        }

        System.out.print(s.size());
    }

}

誰能告訴我為什么打印100而不是1?

似乎有一些自動裝箱......那就是Java在Object和原語之間自動轉換......

如果我...重命名你的類,在Set的初始化中使用Short而不是short ,然后使用......

Set<Short> s = new HashSet<Short>();

for (short i = 0; i < 100; i++) {
    s.add(i);
    s.remove(i - 1);
}

System.out.println(s.size());

它將打印100 ...但為什么?

要回答這個問題,我們需要仔細研究一下remove方法......

Set#remove(Object o)需要一個Object ,而不是像add那樣的泛型類型,而是一個實際的Object ...當你做i - 1 ,Java假設1是一個int並自動縮放類型並自動將其設置為new Integer(i - 1) ...在set中不存在clear(你沒有任何Integer對象!)

但是,如果我們改變s.remove(i - 1); s.remove((short)(i - 1)); ,我們強制將值轉換回short ,然后將其作為new Short(i - 1)裝箱,它確實存在於您的集合中,最終結果是它現在將打印1 ...

簡單;)

在運行此代碼后,我發現在將原始泛型轉換為java.lang.Short ,問題出在你執行i-1 short - int返回int ,因此remove操作嘗試從s刪除Integer intshort ,以及IntegerShort分別非常不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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