程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java謎題選 - I

Java謎題選 - I

編輯:關於JAVA

題目1:Sets的樂趣程序

public class ShortSet{
  public static void main(String args[]) {
    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());
  }
}

選項

(a) 1

(b) 100

(c) Throws exception

(d) None of the above

答案(b)100

分析過程

1 在Set中加入的是一個Short值,但是刪除的卻是Integer的值。(譯者:從留言中,很高興看到有些朋友看到了這一點)

2 此行程序,s.remove(i-1),中的i-1是一個返回值為int的指示。如果i是short或byte類型,當它與int或long做算術運算時,返回的一定是int或long類型的值。

3 在執行s.remove方法時,上面的int值將被autobox成一個Integer對象。

4 注意,包含值1的Short對象和包含值1的Integer對象在比較中不被認為是對等的。

5 在Set中加入Short對象後,再刪除Integer對象,後者的命令是不會被運行的(no-op)。編譯器也不會報錯。

經驗教訓

1 在Java1.5中,Set的接口是這樣定義的:

public interface Set<E>extends Collection<E> {
    public abstract boolean add(E e);
    public abstract boolean remove(Object o);
    ...
  }

根據上面的定義,add方法中傳過去的參數類型一定要與Set中定義的類型一致,否則編譯器會報錯。但是,remove方法卻無此限制,它接受的類型是Object,所以你可以remove任何類型,這就是所謂的type safe。這是在1.5中對Collection的generifying過程中,為了保留對以前版本中方法的支持而造成的。

2 對程序做如下改動就可以解決問題: (short)(i-1); 即把(i-1)的int再cast成short,然後它會被autobox成Short對象,這樣前面指示行裡在Set中加的Short就會被刪除,最後的答案也就變成(a)了。所以,任何牽扯到不同數值類型之間的運算(byte, short, char和int,long),返回的值一定是int或long。 一定要小心,盡量不要混合使用。盡量使用int或long。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved