Java谜题选 - I[Java编程]
本文“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.
以上是“Java谜题选 - I[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |