好艰深的一节,看了两三遍才完全吃透。

覆盖clone方法要谨慎

Java中一个广为人知的复制对象的方法是clone。这个方法看上去方便好用,但实际上问题和限制都很多,所以不推荐使用。需要复制对象的情况下,应该尽可能使用复制构造函数或静态factory方法。

clone方法最大的问题来自于它的实现机制:Cloneable接口。这个接口严重破坏了Java语言中接口的使用规范,所以被称为"extralinguistic"。通常情况下,一个接口需要声明一些方法,而实现接口的类必须覆盖这些方法以提供具体行为。这样的覆盖是强制性的,否则会产生编译错误。但Cloneable接口是一个特例,它没有声明任何方法,实际上是一个空接口,因而实现它的类不会被强制覆盖clone方法。此接口的唯一作用,是作为一个"开关",用来开放Object类中的clone方法。

任何情况下toString方法都应该被覆盖

java.lang.Object已经提供了一个默认的toString方法,它的返回值,是"[类名]@[对象的hash]",比如:"PhoneNumber@163b91"。这样的信息,显然不太有用。所以语言规范中建议开发者在所有Object的子类中都覆盖toString方法,以返回明确易读的关于对象的信息。

在覆盖toString方法时,应该返回关于对象的所有有用信息。如果对象中信息量巨大,那么应该返回一个概要。比如上面电话号码的例子,可以返回类似于"(707) 867-5309"的结果;而对于"曼哈顿黄页"这样的对象,可以返回"Manhattan white pages (1487536 listings)",而不是把所有的listing都列出来。

关于返回值的格式,可以在注释中以规范的形式公布,并且提供一个factory或者构造函数,让开发者可以方便地在对象和它的字符串表示之间转换。这样做的坏处是,一旦规范公布,并且类型被大量使用,之后就很难对其进行修改,因为那将破坏用户端代码。不管toString格式是否提供规范,都应该在注释中说明,比如下面是为item 9中PhoneNumber类定义的toString方法:

很惨的听力:29/40,6.5

错题:1,6,7,9,11,25,31,32,35,36,37

1,6,7,9都错得冤枉:1完全听出来1.4 litres,但看到题目开头那个见鬼的instruction,说最多两个单词,或者一个数字,丫1.4 litres是算两个单词还是一个数字?6,7,9全是同一个错误,拼写正确,没首字母大写;11把E错选为B,现在也不太明白,貌似五个选项都有提及,但肯定有猫腻藏在连接词里,需要精听;剩下六题都是结结实实没听出来,是需要提高水平的地方了。

阅读:36/40,A类8.0

错题:11,18,36,37

听力:34/40,7.5

错题:6,13,16,18,32,33

6,13,16,18都是没跟上局部加快的语速,是水平问题,需要精力更加集中,听清每个细节。32和33比较冤枉,算是疏忽,应在真实考试中避免的:32听出了沙漠,却多写个s,给写成了甜点;33则是听出了science,进到脑子里却变成了scientist,结果整句语意狗屁不通。

阅读:35/40,A类8.0

错题:1,10,15,18,35

耗时分别为:17分钟,17分钟和20分钟

如果equals方法被覆盖,hashCode方法也必须被覆盖

Java语言规范中为Object.hashCode方法制定了须遵守的合约:

1.在程序的同一次运行(execution)中,给定某个对象,如果此对象用于计算equals返回值的信息没有改变,那么多次执行其hashCode方法,都必须返回同样的哈希值。当然,不同的运行之间,哈希值可以不同。

2.如果两个对象,依据equals方法的判定,是相等的,那么他们的哈希值必须相同。

3.如果两个对象,依据equals方法的判定,是不相等的,那么他们的哈希值不一定不等。如果此情况下可以保证两哈希值不等,那么所有依赖哈希值的数据结构(HashMap,HashSet和Hashtable)的性能将被优化。

如果上述合约被破坏,在依赖哈希值的数据结构中,程序的行为将会出错。

听力:33/40,7.5

错题:1,3,26,27,29,30,36

第1题是马虎了,听出minibus,但没看整句,缺了介词by。第3题有些溜号,两个日期没搞清楚。26,27,29,30那一段完全没跟上节奏,听了第二遍才有些眉目。36没听出来,而且那一段节奏也没掌握好。

阅读:33/40,是A类,所以也是7.5

错题:3,5,9,15,26,31,38

第9页 共19页