读<<Java解惑>>后的碎嘴子(第六章)

第六章--库问题
56.
BigInteger fiveThousand = new BigInteger("5000");
BigInteger fiftyThousand = new BigInteger("50000");
BigInteger fiveHundredThousand = new BigInteger("500000");
BigInteger total = BigInteger.ZERO;
total.add(fiveThousand);
total.add(fiftyThousand);
total.add(fiveHundredThousand);
System.out.println(total);

本章重点为库的API问题而不是语言本身问题,本条结果是0而不是550000,从另一个方面说明了API设计时命名的问题,add这个名字容易给使用者错觉:会直接改变total引用的值,但是BigInteger是个不可变类(和String,BigDecimal和各种包装器),需要用引用来接收返回值
总结:本条实际意义不大,在设计API时也要注意方法命名(语法本身方面),JDK库设计本身也有很多不完美的地方(像Ruby这样的好小伙子索性直接以叹号作为方法结尾来代表其会直接改变引用值)

57.本条无需过多描述,大家都知道的
总结:override了equals方法就一定要连hashcode方法也一起覆盖,不然别想用在基于hash的数据结构里,详情见<<Effective Java>>第三章

58.本条不注意看还真看不出来大师的例子是怎么回事,原来是把equals的参数类型搞错了
总结:很简单,在要override的方法声明上加入@Override的注解,避免一切override失误,这在<<Effective Java>>中可是占了专门一个席位

59.例子过程比较吓人,后面的一堆解释更吓人,但是问题却一眼就看出来了:int型中数字0开头的是以八进制来计算的
总结:别在int前傻呵呵地乱加0

60.本条是很受欢迎的风格,通过使用API学习一些小技巧,内容见原书
总结:别忘了集合API中Linked家族集合(在原来Set或Map特性上保持了插入顺序);1.4版本加入了正则表达式,使得一些类和基本所有的第三方正则库光荣下岗;数组方面请关注java.util.Arrays类;5.0中各种基本类型包装类新增了各种位操作方法

61.
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());

本条挺有应用实用性,介绍了JDK设计历史上最杯具的java.util.Date类和连带一起倒霉的java.util.Calendar类,结果打印2000 1,用过Calendar的人一下就明白了:月份是以0开头的,1999年12月31日,参数应该是1999,11,31,这里月份参数设为12,并没有选择给出参数异常而是自动地上滚了年份,日期变成了2000年1月31日,而Date的getDay方法则是返回星期的序数(周日是0,周一是1,2000年1月31日是周一),这和方法名字明显不是一个意思
总结:也没什么,用过一次就都知道怎么回事了,Date和Calendar确实存在着很多问题

62.
Map<String, String> m = new IdentityHashMap<String, String>();
m.put("Mickey", "Mouse");
m.put("Mickey", "Mantle");
System.out.println(m);
打印结果是{Mickey=Mantle},看起来正确其实并不正确,因为用的是IdentityHashMap,与HashMap的区别是判断重复Key时,用的是引用等(==)而不是值等,碰巧String有常量性所以歪打正着
总结:没什么实际意义,可以顺便学习一下IdentityHashMap

63.这条真的纯没用,真的

64.
public class Mod {
public static void main(String[ ] args) {
    final int MODULUS = 3;
    int[] histogram = new int[MODULUS];
    // Iterate over all ints (Idiom from Puzzle 26)
    int i = Integer.MIN_VALUE;
    do {
        histogram[Math.abs(i) % MODULUS]++;
    } while (i++ != Integer.MAX_VALUE);
    for (int j = 0; j < MODULUS; j++)
        System.out.println(histogram[j] + " ");
    }
}
这条要是不查任何东西直接回答结果是相当有难度的,不过根据以往经验,Integer.MIN_VALUE,Integer.MAX_VALUE这样的东西很有可能会捣乱,重点在于Math.abs(int i)方法,参数为Integer.MIN_VALUE时会返回原值而不是绝对值
总结:本条其实是想提醒你多看javadoc文档

65.作为本章最后一条,例子很长,篇幅更长,意义还是如往常一样简单直接,这条和上一条bloch大师明显玩的比较高兴,唠唠叨叨了一大车
总结:Java里没有像ruby/perl那样的超级宇宙航天飞船符号(<=>),你得自己在compareTo或compare方法里自己明确返回-1,0或1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章