A 前者在stack中分配内存,后者在heap中分配内存 B 使用前者的时空代价低,使用后者的时空代价高 C 前者是immutable的,后者是mutable的 D 前者和后者中的某些类型可通过auto-boxing进行自动转换,例如int和Integer
正确答案:ABD
单选题 第2题 1分
Static type checking 和 dynamic type checking 的区别,不正确的是____
A 前者在编译阶段发生,后者在运行阶段发生 B 前者比后者更能带来程序的健壮性,因为可以在程序投入运行前就发现错误 C 前者能发现数组访问越界的错误,后者能发现divide by 0的错误 D 前者是关于“类型合法性”的检查,后者是关于“值的合法性”的检查
正确答案:C
多选题 第3题 2分
以下代码段中,会在运行阶段发生错误的是___
A
int[] arr = new int[] {1,2};
arr[2] = 3;
B
int[] arr = new int[] {1.2};
arr[0] = "3";
C
String s = null;
System.out.println(s == null);
D
String s = null;
System.out.println(s.length());
正确答案:AD
单选题 第4题 1分
以下__不是static type checking所能处理的编程错误
A 所调用函数的参数数目错误 B 调用一个指向null的对象的某个方法 C 函数的return语句返回的变量类型与函数声明中的返回值类型不匹配 D 赋值语句右侧的值类型与左侧的变量类型不匹配
正确答案:B
多选题 第5题 2分
___不具备static typing (即static type checking)的能力
A Java B C++ C Python D Ruby E Perl F PHP
正确答案:CDEF
填空题 第6题 2分
String a = "5" + 6;
System.out.println(a);
会在控制台打印出什么? [填空1]
可填写“编译错误”、“运行错误”,或具体输出的字符串,无需带引号。
int a = "5" + 6;
System.out.println(a);
此时的打印输出呢? [填空2]
正确答案: 56;编译错误
3-1(b) Mutability and Immutability
单选题 第1题 1分
关于mutable和immutable的说法,不正确的是__
A 所有简单数据类型和所有相对应的封装类(Integer, Double, Boolean等)都是immutable的 B 所有数组都是mutable的 C 使用immutable类型可以降低程序蕴含bug的风险,但其时空性能相对较差 D 一个immutable的类,一旦其constructor方法执行结束并产生了类的实例,则该实例的任何成员变量都不能够再被做任何修改
正确答案:D
单选题 第2题 1分
针对final关键字,说法不正确的是___
A A final class declaration means it cannot be inherited. B A final variable means it always contains the same value/reference but cannot be changed C A final method means it cannot be overridden by subclasses D The contents in a final Arraylist cannot be changed during its lifecycle.
正确答案:D
填空题 第3题 4分
String a = "a";
String c = a;
a += "b";
c += "c";
StringBuilder b = new StringBuilder(a);
StringBuilder d = b;
b.append("b");
d.append("c");
A 使用不可变类型,对其频繁修改会产生大量的临时拷贝 B 可变类型可直接修改其值而无需太多拷贝,从而提高效率 C 不可辩数据类型更“安全”,因为其值无法修改 D 使用可变类型做“全局变量”,可在不同模块之间高效率的进行共享数据读写
正确答案:ABCD
多选题 第5题 2分
final List l1 = new ArrayList<>();
List l2 = new ArrayList<>();
1. l1.add("a");
2. l1.set(0, "b");
3. l1 = l2;
4. l2 = l1;
在上面标号1-4的四行中,无法通过static type checking的是_____
A 1 B 2 C 3 D 4
正确答案:C
填空题 第6题 3分
List k = new ArrayList<>();
k.add("lab1 ends");
Irerator it = k.iterator();
System.out.println(it.hasNext());
it.next();
System.out.println(it.hasNext());
k.remove(0);
System.out.println(it.hasNext());
分别输出的是 [填空1] 、 [填空2] 、 [填空3]
填写true或者false即可。
正确答案: TRUE;FALSE;TRUE 答案解析:
第三个填空,输出TRUE,这让人很费解,试着查阅资料了解一下原因。
单选题 第7题 1分
List t = new ArrayList<>();
t.addAll(Array.asList("a","b"));
Iterator i = t.titerator();
while(i.hasNext())
if(i.next() == "a")
i.remove();
期望结果是t中只包含"b"。 以下说法正确的是____
A Static type checking未通过 B 执行时出现dunamic error,抛出异常 C 正常执行,但结果与期望不一致 D 正常执行,结果与期望一致
正确答案:D
3.2 Specification
多选题 第1题 2分
两个方法具有“行为等价性(behavior equivalence)”,以下说法正确的是_____
A 站在客户端的视角看,它们实现相同的功能 B 站在客户端的角度看,它们可能展现出不同的性能 C 它们具有相同的规约(spec) D 它们具有相同的实现算法和异常处理策略 E 其实是针对同一个spec来说是等价的。若对这个spec进行更改,这两个方法也许就不等价了
正确答案:ABCE
单选题 第2题 1分
以下关于方法spec的说法,不恰当的是__
A 程序员针对给定的spec写代码,需做到“若前置条件满足,则后置条件必须要满足” B 前置条件是对client端的约束,后置条件是对开发者的约束 C 若客户端传递进来的参数不满足前置条件,则方法可直接退出或随意返回一个结果 D 一个方法的前置条件比另一个方法的前置条件更强,二者的后置条件相同,则前者spec的强度比后者大
A 除非在post-condition中明确声明过,否则方法内部代码不应该改变(mutate)输入参数 B 方法的spec描述里不能使用内部代码中的局部变量或该方法所在类的private属性 C 若在方法的post-condition中声明“client端不能修改该方法所返回的数量”,可以减少该方法的潜在bug D 若为某方法设计JUnit test case,在任何test case中对该方法的调用必须遵循其pre-condition
正确答案:ABD
多选题 第5题 2分
如果修改了某个方法的spec使之变弱了,那么可能发生的是__
A Client调用该方法的代价变大了,即client需要对调用时传入该方法的参数做更多的检查 B 程序员实现该spec的难度增大了,自由度降低了 C 如果用椭圆面积表示spec的强度,那么该方法的椭圆面积增大了 D 该spec的实现方式更多了
正确答案:ACD
单选题 第6题 1分
这两个Spec的强度有何关系? static int findOneOrMore,FirstIndex(int[] a, int val)
requires: val occurs at least once in a
effects: returns lowest index i such that a[i] = val
static int findCanBeMissing(int[] a, int val)
requires: nothing
effects: returns index i such that a[i] = val, or -1 if no such i
A 前者强于后者 B 前者弱于后者 C 二者相同 D Not compatible
正确答案:D
3.3 Abstract Data Type (ADT)
填空题 第1题 4分
类WordList有四个方法,根据其方法定义来确定其类型
1. public WordList(List words)
2. public void unique()
3. public WordList getCapitalized()
4. public Map getFrequencies()
使用C、M、P、O分别表示Creator, Mutator, Producer, Observer
1 [填空1] 2 [填空2] 3 [填空3] 4 [填空4]
正确答案: C;M;P;O
单选题 第2题 1分
以下关于ADT的RI和AF的说法,不正确的是___
A ADT的Abstract空间(A)中的某个值,在其Rep空间®中可能有多个值与其对应 B 若ADT的某个方法返回一个mutable的对象,并不一定表明该ADT产生了表示泄露 C 若ADT的任意costructor所构造出的object都满足RI、每个mutator方法执行结束后都保持RI为真,那么该ADT的RI就始终为真 D 一个immutable的ADT,其rep可以是mutable的
正确答案:C 答案解析:
针对B选项:通过defensive copy返回mutable对象,其实并未产生表示泄露
针对C选项:如果存在表示泄露,外部client就可以修改内部rep的值,就可能导致RI违反。
针对D选项:of course,只要没有rep exposure就没有问题。
多选题 第3题 2分
关于invariants、AF和RI,说法不正确的是__
A 如果一个immutable的ADT存在rep exposure,那么就违反了该ADT的invariants B 如果在一个mutator方法内没有checkRep(),那么RI就可能被违反了 C 两个ADT有相同的rep和相同的AF,那么其RI一定相同 D 两个ADT有相同的rep和相同的RI,但可能AF不同
A Parameters of operation B Data type of return values of the operation C Exceptions thrown by the operation D Mathematical values in the Rep space ® E Mathematical values in the Abstract space (A)
正确答案:D 答案解析:
Spec要给client看,那么所有内部的东西都不能用。R是rep的值空间,只能开发者自己了解。
多选题 第7题 2分
在对ADT的方法进行JUnit测试时,以下说法正确的是____
A 如果某方法的返回值为void,则无法为其撰写测试用例,因为无法assertEquals() B 对constructor方法,测试用例中需要在构造新对象之后调用observer方法确认构造结果是否正确 C 对mutator方法,测试用例中需要在该方法执行之后调用producer方法确认是否做了正确的mutate D 对observer方法,测试用例中需要使用其他三类方法构造一个对象,再执行该方法并判断结果是否正确
正确答案:BD
多选题 第8题 2分
以下说法不正确的是__
A 只要有public的field,就一定有表示泄露 B 只要有 非final的field,就一定产生表示泄露 C 除了初始化,Immutable的类中一定不能存在其他任何改变rep的方法 DcheckRep()方法可能消耗大量计算,在程序投入实际运行的时候要注释掉
针对你设计的一个ADT,不应该提供给client看的内容包括__ A AF B RI C Rep exposure safety argument D Spec E Testing strategy F Rep G Implementation H Test cases
正确答案:ABCEFGH
3.4 Object-Oriented Programming (OOP)
多选题 第1题 2分
关于static和final的说法,正确的是____
A 一个变量被声明为final,意味着它在被首次赋值之后,其内容就不能再变化 B static类型的方法,调用时无需创建类的实例对象,可直接通过类名使用 C 被声明为final类型的类,无法从中派生出子类 D 被声明为final类型的方法,无法在子类中被override E 类A的static方法中不能直接调用A的instance方法(而是要new一个A的对象再调用);A的instance方法中可以直接调用A的static方法
正确答案:BCDE
多选题 第2题 2分
关于Java interface的说法,正确的是__
A 不能有static方法 B 不能有constructor(构造器) C 不能有final方法 D 不能有private方法 E 不能有fields(属性)
正确答案:BCD 答案解析:
E选项:可以有属性的,都是public static final的。
多选题 第3题 2分
关于class和interface的说法,不正确的是____
A 一个接口可以extends一个或多个其他接口 B 一个类只能implements一个接口 C 一个类不能同时extends另一个类和implements一个接口 D 一个类implements了一个接口,意味着它必须要实现该接口中的所有方法 E 一个类除了实现其implements的接口中的方法,还可以增加新的方法
正确答案:BC
单选题 第4题 1分
某方法的定义是public int getLength (List list, boolean bFliter),以下___不是对该方法的合法重载
Aprivate int getLength(List list, String regex) Bpublic Integer getLength(List list) Cpublic int getLength(List list) throws IOException Dpublic void getLength(List