[英]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
。 int
和short
,以及Integer
和Short
分別非常不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.