最近在做往年题,不确定或者做错的题目在此记录,以方便同学们复习。
1.2018年第六题
正确的选项是:D
这个说法是不正确的。如果一个 ADT 是 immutable(不可变的),那么其 rep(表示)应该是不可变的,即不可被修改的。Immutable ADT 的 rep 应该是一个固定的值,不允许在对象的生命周期中发生变化。因此,一个 immutable 的 ADT 的 rep 不应该是 mutable(可变的)。
解释每个选项:
A. ADT 的 Abstract 空间(A)中的某个值,在其 Rep 空间(R)中可能有多个值与其对应 这个说法是正确的。在 ADT 中,Abstract 空间中的一个值可以对应于 Rep 空间中的多个不同值。这是因为 ADT 的实现可能使用不同的表示方式,但仍能保持相同的抽象行为。
B. 如果 ADT 的某个方法返回一个 mutable 的对象,并不一定表明该 ADT 产生了表示泄露 这个说法是正确的。返回一个 mutable 对象并不一定表示 ADT 产生了表示泄露。表示泄露是指通过该对象可以修改 ADT 的不变量或破坏 ADT 的抽象行为。然而,有时候 ADT 可能需要返回一个可变对象,但仍能确保该对象不会导致表示泄露。
C. 如果 ADT 的任意 constructor 所构造出的 object 都满足 RI、每个 mutator 方法执行结束后都保持 RI 为真,那么该 ADT 的 RI 就永远保持为真 这个说法是正确的。如果 ADT 的构造函数确保构造的对象满足表示不变量(Representation Invariant),并且每个 mutator 方法执行完后都保持表示不变量为真,那么 ADT 的表示不变量将永远保持为真。这是 ADT 设计和实现中的一个重要原则。
综上所述,选项 D 是不正确的。
2.2021第七题
选项 C 自反性、传递性、对称性
该方法违反了自反性、传递性和对称性。
-
自反性:equals() 方法应满足自反性,即对于任何非空引用值 x,x.equals(x) 应该返回 true。然而,在给定的方法中,并没有检查传入的对象是否与当前对象是同一个对象,而是仅检查了两个对象的属性是否相等。因此,该方法违反了自反性。
-
传递性:equals() 方法应满足传递性,即对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 也返回 true,则 x.equals(z) 应该返回 true。然而,在给定的方法中,并没有比较传入对象 p 的属性与当前对象的属性是否相等,而是直接比较了两个对象的属性。因此,该方法违反了传递性。
-
对称性:equals() 方法应满足对称性,即对于任何非空引用值 x 和 y,如果 x.equals(y) 返回 true,则 y.equals(x) 也应该返回 true。在给定的方法中,只检查了传入对象 p 的属性与当前对象的属性是否相等,而没有检查当前对象的属性与传入对象 p 的属性是否相等。因此,该方法违反了对称性。
综上所述,选项 C 自反性、传递性、对称性是被违反的特性。
3.2018年十二题
以下是对每个步骤的解释:
- 初始化 FileReader 对象 reader 为 null。
- 进入 try 块。
- 调用 FileReader 的构造函数来打开文件 "someFile"。如果文件不存在,则会抛出 FileNotFoundException 异常。
- 初始化变量 i 为 0。
- 进入 while 循环,检查 i 是否不等于 -1。
- 调用 reader.read() 读取文件中的一个字符,赋值给变量 i。如果读取到文件末尾,则返回值为 -1。该方法可能会抛出 IOException 异常。
- 将读取的字符转换为 char 并打印。
- 如果捕获到 FileNotFoundException 异常,则进入相应的 catch 块。
- 打印 FileNotFoundException 的堆栈跟踪信息。
- 如果捕获到 IOException 异常,则进入相应的 catch 块。
- 进入 finally 块。
- 检查 reader 是否为 null。
- 如果 reader 不为 null,则调用 reader.close() 方法关闭文件。该方法可能会抛出 IOException 异常。
- 如果捕获到 IOException 异常,则打印堆栈跟踪信息。
- 退出 finally 块。
- 打印 "End"。
综上所述,选项 D 描述了代码的正确执行路径。
4.2018十五题
当执行以上代码的 main() 方法后,控制台的输出内容可能是 "ac" 或 "bc",因为线程 B 的 run() 方法中的代码可能会打印 "a" 和 "c",或者由于线程被中断而抛出 InterruptedException,从而打印 "b"。
选项 C ab 不可能是控制台的输出内容。因为在代码中,如果线程 B 的 run() 方法被中断,则会抛出 InterruptedException,并打印 "b",而不会打印 "a"。因此,选项 C 是不可能的输出结果。
综上所述,选项 C ab 是不可能作为控制台的输出内容。
5.2019年第三题
选项 A 中被 static 和 final 修饰的 Date departTime 是不可变的,但没有提及其是否是 ADT 的一部分。
选项 B 中提到采用 State 设计模式以使对象具备状态转换功能的 ADT 是可变的,与不可变性相悖。
选项 D 中 new ArrayList<String>().iterator() 得到的结果是可变的 Iterator 对象,而不是不可变的。
因此,选项 C 是最符合 immutability 和 mutability 特性的说法,描述了由 Collections.unmodifiableList()
方法创建的不可变 List 对象。
6.2019年第九题
正确答案是 D。根据控制台输出信息,可以看到该程序抛出了 CarAlreadyParkingException 异常,并且该异常未被捕获和处理。因此,选项 D 是最恰当的描述。选项 A 中的说法是错误的,因为该异常并没有在 A 类的第 111 行被捕获。选项 B 中的说法也是错误的,因为根据异常名称可以判断出该异常是一个 checked 异常。选项 C 中的说法也是错误的,因为即使这些类中的 parking 方法包含 throws CarAlreadyParkingException,也不意味着该异常会被捕获和处理。