快速业务通道

Java谜题选 - I - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20

Java谜题选 - I

时间:2011-01-29 yeeyan 译: 易晓斓

题目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。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号