[b]谜题61:日期游戏[/b]
打印出的结果是2000 1。
第一个bug就是cal.set(1999, 12,31);当月份以数字来表示时,习惯上我们将第一个月赋值为1。遗憾的是,Date将第一个月表示为0。因此设置为了13个月的第31天。Calendar类替换为下一年的第一个月。修改的最好方法是:使用Calendar专有的常量。cal.set(1999, Calendar.DECEMBER,31);
第二个bug就是[color=red]Date.getDay返回的是Date实例所表示的星期日期,而不是月份日期[/color]。这个返回值是基于0的,从星期天算起。
[b][color=red]总之,在使用Calendar和Date时,一定要查看API文档。[/color][/b]
[b]谜题62:名字游戏[/b]
[color=red]不要使用IdentityHashMap,除非你需要其基于标识的语义;它不是一个通用目的的Map实现。[/color]
[b]谜题63:更多同样的问题[/b]
居然是0,为什么呢?因为该类没有任何程序员声明的构造器。注意public void MoreNames() 方法不是构造器。编程处处要小心啊!![color=red]本题的教训:不要因为偶然地添加了一个返回类型,而将一个构造器声明为一个方法声明。[/color]
[b]谜题64:按余数编组[/b]
该程序抛出java.lang.ArrayIndexOutOfBoundsException异常。abs方法几乎总是返回它的参数的绝对值,但是在一种情况下,它做不到这一点。[color=red]"如果参数等于Integer.MIN_VALUE,那么产生的结果与该参数相同,它是一个负数。”[/color]本题教训:[color=red]Math.abs不一定保证一定会返回非负的结果。[/color]
import java.util.Calendar;
import java.util.Date;
public class D{
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
cal.set(1999, 12,31);
System.out.print(cal.get(Calendar.YEAR)+" ");
Date d = cal.getTime();
System.out.println(d.getDay()); //该方法已被弃用了
}
}
打印出的结果是2000 1。
第一个bug就是cal.set(1999, 12,31);当月份以数字来表示时,习惯上我们将第一个月赋值为1。遗憾的是,Date将第一个月表示为0。因此设置为了13个月的第31天。Calendar类替换为下一年的第一个月。修改的最好方法是:使用Calendar专有的常量。cal.set(1999, Calendar.DECEMBER,31);
第二个bug就是[color=red]Date.getDay返回的是Date实例所表示的星期日期,而不是月份日期[/color]。这个返回值是基于0的,从星期天算起。
[b][color=red]总之,在使用Calendar和Date时,一定要查看API文档。[/color][/b]
[b]谜题62:名字游戏[/b]
import java.util.IdentityHashMap;
import java.util.Map;
public class Difference {
public static void main(String[] args) {
Map<String,String> m = new IdentityHashMap<String,String>();
m.put("Mickey","Mouse");
m.put("Mickey","Duck");
System.out.println(m.size()); //1
}
}
[color=red]不要使用IdentityHashMap,除非你需要其基于标识的语义;它不是一个通用目的的Map实现。[/color]
[b]谜题63:更多同样的问题[/b]
import java.util.HashMap;
import java.util.Map;
public class MoreNames {
private Map<String, String> m = new HashMap<String, String>();
public static void main(String[] args) {
MoreNames n = new MoreNames();
System.out.println(n.size()); //0
}
private int size() {
return m.size();
}
public void MoreNames() {
m.put("Mickey", "Mouse");
m.put("Mickey", "Duck");
}
}
居然是0,为什么呢?因为该类没有任何程序员声明的构造器。注意public void MoreNames() 方法不是构造器。编程处处要小心啊!![color=red]本题的教训:不要因为偶然地添加了一个返回类型,而将一个构造器声明为一个方法声明。[/color]
[b]谜题64:按余数编组[/b]
public class Mod {
public static void main(String[] args) {
final int N = 3;
int[] histogram = new int[N];
int i = Integer.MIN_VALUE;
do{
histogram[Math.abs(i)%N]++;
}while(i++!=Integer.MAX_VALUE);
for(int j = 0;j<N;j++){
System.out.println(histogram[j]+" ");
}
}
}
该程序抛出java.lang.ArrayIndexOutOfBoundsException异常。abs方法几乎总是返回它的参数的绝对值,但是在一种情况下,它做不到这一点。[color=red]"如果参数等于Integer.MIN_VALUE,那么产生的结果与该参数相同,它是一个负数。”[/color]本题教训:[color=red]Math.abs不一定保证一定会返回非负的结果。[/color]